2024年150道高频Java面试题(三十二)

63. 线程的 run() 和 start() 有什么区别?

在Java中,run()方法和start()方法是线程操作中的两个核心方法,它们来自于Thread类。

run()方法:

  • run()方法是一个线程的实际执行代码所在的方法。
  • 它是一个由Runnable接口定义的抽象方法,因此任何实现Runnable接口的类都需要覆盖这个方法。
  • run()方法被调用时,它会在当前线程的上下文中执行(即,如果直接调用一个线程对象的run()方法,它会在调用它的线程中运行,而不是在新线程中运行)。
  • run()方法可以多次调用,它仅仅是一个普通的方法调用。

start()方法:

  • start()方法是用来启动新线程并执行run()方法中的代码的。
  • 当调用start()方法时,它会创建一个新的线程,然后在这个新线程中调用run()方法。
  • 一个线程对象只能调用一次start()方法,多次调用会抛出IllegalThreadStateException
  • start()方法是由JVM调用来启动线程的,而不是由开发者在代码中直接调用的。

以下是两者的简单对比表格:

对比项run()方法start()方法
调用目的执行线程任务启动一个新线程
调用次数可以多次调用只能调用一次
调用效果在当前线程中执行创建新线程,在新线程中执行run()
异常处理直接在调用线程中抛出任何未捕获异常由新线程处理
方法来源实现Runnable接口时覆盖继承Thread类时使用

以下是一个简单的代码示例说明这两个方法的不同:

class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Thread is running: " + Thread.currentThread().getName());}
}public class ThreadExample {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();// 通过start()方法启动新线程Thread thread = new Thread(myRunnable);thread.start(); // 正确使用start()方法启动线程// 直接调用run()方法,不会启动新线程myRunnable.run(); // 这将在main线程中执行,而不是新线程// 以下调用是错误的,会抛出异常// thread.start(); // 不能重复调用start()方法}
}

在这个示例中,我们创建了一个实现Runnable接口的类MyRunnable,并在主方法中创建了Thread对象。调用start()方法将创建一个新线程,并在该线程中调用MyRunnablerun()方法。而直接调用run()方法则不会创建新线程,而是在当前线程(这里是主线程)中执行run()方法中的代码。

64. 创建线程池有哪几种方式?

在Java中,创建线程池可以通过几种方式实现,通常使用java.util.concurrent.Executors工厂类或者直接实例化java.util.concurrent.ThreadPoolExecutor。以下是几种常见的创建线程池的方式:

  1. 使用Executors
    • 固定大小的线程池:使用Executors.newFixedThreadPool(int nThreads)创建一个线程池,该线程池的线程数量固定,如果某个线程因为异常结束,那么会补充一个新的线程。
    • 单线程的Executor:使用Executors.newSingleThreadExecutor()创建一个单线程的执行器,所有提交的任务都会被串行执行。
    • 可缓存的线程池:使用Executors.newCachedThreadPool()创建一个根据需要创建新线程的线程池,对于旧线程,如果60秒没有被使用就将被回收。
    • 计划任务的线程池:使用Executors.newScheduledThreadPool()创建一个可以定时执行任务的线程池。
  2. 直接使用ThreadPoolExecutor构造函数
    • 可以通过直接实例化ThreadPoolExecutor类来创建自定义的线程池。这需要指定以下参数:
      • int corePoolSize:核心线程数。
      • int maximumPoolSize:最大线程数。
      • long keepAliveTime:非核心线程的空闲存活时间。
      • TimeUnit unit:存活时间的单位。
      • BlockingQueue<Runnable> workQueue:工作队列。
      • ThreadFactory threadFactory:可选,用于创建新线程的工厂。
      • RejectedExecutionHandler handler:可选,当任务无法执行时的策略。
  3. 使用ForkJoinPool
    • 对于需要大量计算并且能够进行分治任务拆分的应用,可以使用ForkJoinPool。它适用于递归算法或者可以递归分解为更小任务的大任务。

以下是使用ThreadPoolExecutor创建线程池的示例代码:

import java.util.concurrent.*;public class CustomThreadPool {public static void main(String[] args) {// 创建自定义线程池ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // 核心线程数4, // 最大线程数60, // 非核心线程空闲存活时间TimeUnit.SECONDS, // 存活时间单位new ArrayBlockingQueue<>(10) // 工作队列);// 提交任务for (int i = 0; i < 10; i++) {executor.submit(() -> {System.out.println("执行任务: " + Thread.currentThread().getName());});}// 关闭线程池executor.shutdown();}
}

以上就是创建线程池的几种方式及其简单示例。注意,在实际的生产环境中,建议直接使用ThreadPoolExecutor构造函数来精确控制线程池的行为,避免因为默认参数而引发的潜在问题。

有帮助请点赞收藏呀~

领【150 道精选 Java 高频面试题】请 go 公众号:码路向前 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java文件夹文件比较工具

import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.HashSet; import java.util.Set;public class FolderFileNames {public static void main(String[] args) {// 假设您要读取的文件夹路径是 &q…

35. 搜索插入位置 C++

今天开始刷力扣hot100&#xff0c;还是那句话&#xff0c;把时间投资在自己身上绝对是最最值最最赚的&#xff0c;我相信我自己&#xff0c;我也相信坚持付出的力量&#xff0c;力扣这边刷题我准备主打C&#xff0c;加油&#xff0c;先从二分查找开始&#xff01; 给定一个排序…

ubuntu 配置 spacemouse以及通过python/robosuite使用spacemouse

一 前言 3dconnexion 早在2014年就不更新对linux系统的驱动&#xff0c;因此安装驱动需要参考另一个网站&#xff1a;https://spacenav.sourceforge.net/ 二 安装步骤 1 安装 spacenavd 先安装依赖库 sudo apt install libxext-dev libxrender-dev libxmu-dev libxmuu-dev…

maridb双数据源联查解决方案:联合存储引擎(Federated Storage Engine)

本地MySQL数据库要访问远程MySQL数据库的表中的数据, 必须通过FEDERATED存储引擎来实现. 有点类似Oracle中的数据库链接(DBLINK)。使用FEDERATED存储引擎的表,本地只存储表的结构信息,数据都存放在远程数据库上,查询时通过建表时指定的连接符去获取远程库的数据返回到本地。操作…

PCA(Principal Component Analysis,主成分分析)与矩阵X的协方差矩阵之间的联系

PCA&#xff08;Principal Component Analysis&#xff0c;主成分分析&#xff09;是一种常用的降维技术&#xff0c;用于将高维数据集投影到低维空间中。在PCA中&#xff0c;投影方程将原始特征向量 ( x 1 , x 2 , … , x p ) (x_1, x_2, \ldots, x_p) (x1​,x2​,…,xp​)映射…

Linux 网络编程项目--简易ftp

主要代码 config.h #define LS 0 #define GET 1 #define PWD 2#define IFGO 3#define LCD 4 #define LLS 5 #define CD 6 #define PUT 7#define QUIT 8 #define DOFILE 9struct Msg {int type;char data[1024];char secondBuf[128]; }; 服务器: #i…

【天软行业全景画像】报告第8期

行业全景画像因子 报告概要&#xff1a;传媒、环保、机械设备行业的拥挤度较高&#xff0c;实际投资交易应注意&#xff1b;煤炭、银行、石油石化行业动量较强&#xff0c;医药生物、综合、计算机行业动量较弱&#xff0c;业绩整体表现较差&#xff1b;食品饮料、公用事业行业景…

书生·浦语大模型实战营(第二期):XTuner 微调 LLM

目录 Finetune简介两种Finetune范式一条数据的一生标准格式数据添加对话模板两种finetune的loss计算 LoRA&QLoRA XTunerXTuner简介XTuner快速上手安装&训练配置模板对话工具数据处理数据集映射函数 InternLM2 1.8B模型多模态LLM给LLM装上电子眼&#xff1a;多模态LLM原…

技术速递|为 .NET iOS 和 .NET MAUI 应用程序添加 Apple 隐私清单支持

作者&#xff1a;Gerald Versluis 排版&#xff1a;Alan Wang Apple 正在推出一项隐私政策&#xff0c;将隐私清单文件包含在针对 App Store 上的 iOS、iPadOS 和 tvOS 平台的新应用程序和更新应用程序中。请注意&#xff0c;至少目前 macOS 应用程序被排除在外。 隐私清单文件…

el-table-column叠加el-popover使用

需求&#xff1a;el-table-column有一列展示多个tag信息&#xff0c;实现点击tag展示tag信息以及tag对应的详细信息 table的数据格式 data:[{...,isPopoverVisible:false,},{...,isPopoverVisible:false,},... ]写法&#xff1a; <el-table-column label"配置信息&q…

死磕GMSSL通信-C/C++系列(一)

死磕GMSSL通信-C/C++系列(一) 最近再做国密通信的项目开发,以为国密也就简单的集成一个库就可以完事了,没想到能有这么多坑。遂写下文章,避免重复踩坑。以下国密通信的坑有以下场景 1、使用GMSSL guanzhi/GmSSL进行通信 2、使用加密套件SM2-WITH-SMS4-SM3 使用心得 ​…

【个人博客搭建】(3)添加SqlSugar ORM 以及Json配置文件读取

1、安装sqlsugar。在models下的依赖项那右击选择管理Nuget程序包&#xff0c;输入sqlsugarcore&#xff08;因为我们用的是netcore&#xff0c;而不是net famework所以也对应sqlsugarcore&#xff09;&#xff0c;出来的第一个就是了&#xff0c;然后点击选择版本&#xff0c;一…

ABAP 提示框 汇总

文章目录 前言 1.POPUP_TO_DISPLAY_TEXT 2.POPUP_TO_CONFIRM 3.G_DISPLAY_SELECTION_DYNPRO 4.REUSE_ALV_POPUP_TO_SELECT 5.POPUP_TO_DECIDE_LIST 6.POPUP_WITH_TABLE_DISPLAY_OK 7.BKK_POPUP_DISPLAY_LIST 8. POPUP_TO_CONFIRM_WITH_MESSAGE 9.POPUP_TO_CONFIRM 1…

MinIO + Prometheus + Grafana docker部署

文章目录 说明MinIO简介MinIO 容器化部署Prometheus服务地址配置方法一&#xff1a;先部署后修改方法二&#xff1a;部署时修改compose文件&#xff08;未验证&#xff09; MinIO Access Key配置Prometheus 容器化部署MinIO 生成抓取配置修改Prometheus配置文件Grafana 容器化部…

python3.poc。sqlmapTamperPocsuite

目的&#xff0c;掌握工具的api接口&#xff0c;框架工具二次开发 ---sqlmap的api接口&#xff1a;https://www.freebuf.com/articles/web/204875.html 应用&#xff1a;配合前期信息收集的到可能存在注入点的地方&#xff0c;批量化的去扫描 #开发当前项目过程&#xff1a…

YOLOv8改进 | Conv篇 | CVPR2024最新DynamicConv替换下采样(包含C2f创新改进,解决低FLOPs陷阱)

一、本文介绍 本文给大家带来的改进机制是CVPR2024的最新改进机制DynamicConv其是CVPR2024的最新改进机制,这个论文中介绍了一个名为ParameterNet的新型设计原则,它旨在在大规模视觉预训练模型中增加参数数量,同时尽量不增加浮点运算(FLOPs),所以本文的DynamicConv被提出…

华为OD-C卷-靠谱的车[100分]C语言-100%

题目描述 程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。 出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。 比如: 23再多一块钱就变为25;39再多一块钱变为50;399…

VictoriaMetrics安装部署

安装部署 1、 去 vm release 下载编译好的二进制版本&#xff0c;比如我们选择下载 v1.69.0 amd64。 2、 解压缩后得到&#xff1a; $ ls -l vm*-prod -rwxr-xr-x 1 work work 10946416 Nov 8 22:03 vminsert-prod* -rwxr-xr-x 1 work work 13000624 Nov 8 22:03 vmselect…

书生·浦语大模型全链路开源体系-第6课

书生浦语大模型全链路开源体系-第6课 书生浦语大模型全链路开源体系-第6课相关资源Lagent & AgentLego 智能体应用搭建环境准备创建虚拟环境安装LMDeploy安装 Lagent安装 AgentLego Lagent 轻量级智能体框架使用 LMDeploy 部署启动并使用 Lagent Web Demo使用自定义工具获取…

倾斜摄影技术的特点及应用有哪些?

倾斜摄影测量技术&#xff08;Oblique Photogrammetry&#xff09;是一种通过使用倾斜角度相机拍摄图像的方法来进行测量和建模的技术。与传统的垂直摄影测量技术不同&#xff0c;倾斜摄影测量技术通过使用摄影机倾斜角度相对于垂直方向较大的角度来拍摄图像&#xff0c;从而能…