创建线程的方式

【Java用法】关于线程的创建方式,已知全网最全面的总结,七种创建线程的方式 关于创建线程的方式,属于基础的面试问题,一定要能够回答全哈,不过呢平时我们也会经常遇到,所以还是希望把这向种创建线程的方式全部记下来。 阅读详情

前置说明

Thread类的作用:(创建线程、启动线程,中止线程、定义线程)概括来说就是:定义线程和操作线程,但线程要执行的任务Thread类自身并不定义,而是通过构造函数从外部传入且只接受Runnable函数式接口定义的任务

Runnable函数式接口的作用:定义线程要执行的任务,方法无返回值,不可以抛出异常,有异常需要自行捕获。

Callable<V>函数式接口的作用:和Runnable函数式接口类似,用来定义线程要执行的方法,可以有返回值,可以抛出异常,返回值类型由泛型指定;但和Runnable接口不同的是线程不接受Callable接口定义的任务,如果想线程能够执行Callable任务需要配合FutureTask一起使用。

FutureTask<V>类的作用:为线程提供可执行的任务,该类有两个构造函数,一个可以接受Runnable实例和一个泛型两个参数,另一个可以接受Callable实例参数(一般都是用这个);该类实现RunnableFuture<V>接口继承了Runnable, Future<V>这两个接口,所以FutureTask类可以说是Runnable, Future这两个接口的实现类(Future<V>接口的作用是让我们可以方便的操作Callable<V>接口的返回值),而由于Thread只接受Runnable的任务,所以Thread也可以接受FutureTask的任务,而FutureTask类中的任务实际内容又是调用构造函数入参中Runnable和Callable实例中定义的任务。也就是说FutureTask自身并不生产任务,他只是任务的搬运工。

前置总结:如果想创建一个有任务可执行的线程,就必须向Thread类的构造函数中传入一个Runnable的实现类,这个实现类可以是Runnable接口的直接实现类,也可以是间接实现类。

线程的四大创建方式

1、继承Thread类

由于Thread类实现了Runnable接口,因此我们只需要创建一个Thread类的子类并重写父类的run方法

然后使用Thread类中接受Runnable任务的构造函数创建一个线程实例,并将前面继承Thread类的子类作为入参传入,然后就可以使用Thread类的 start 方法启动一个有任务可以执行的线程。

2、实现Runnable接口

由于Thread类只接受Runnable接口定义的任务,所以想要创建一个有任务可以执行的线程,我们可以实现Runnable接口,然后将该Runnable实现类作为参数传入Thread类的构造函数来创建线程,最后使用Thread类的 start 方法启动一个有任务可以执行的线程。

3、实现Callable<V>接口

由于实现Callable<V>接口的任务不能直接作为Thread类的执行任务,所以我们可以通过结合FutureTask类,将Callable接口的实现类实例作为参数传入FutureTask类的对应构造函数,然后将构造的FutureTask类实例作为入参传入Thread类的构造函数来创建一个线程,最后使用Thread类的 start 方法启动一个有任务可以执行的线程。

4、使用线程池

我们可以使用 Executors 线程工具类 ExecutorService service = Executors.newFixedThreadPool(10);来创建一个有10个线程的线程池,线程池中的所有线程都处于无任务可执行的等待状态,所以我们可以向线程池中传入Runnable接口间接或直接实现类任务。 service.execute(new NumberThread());

也可以使用 下面的ThreadPoolExecutor类的构造函数来创建线程池

ThreadPoolExecutor(int corePoolSize,
                   int maximumPoolSize,
                   long keepAliveTime,
                   TimeUnit unit,
                   BlockingQueue<Runnable> workQueue)

corePoolSize 指的是核心线程数,

这些核心线程一直存在,是线程池的最小线程数,除非我们设置了 allowCoreThreadTimeOut 来允许核心线程超时回收,

maximumPoolSize 指的是最大线程数

当系统迎来大量请求需要大量线程来处理时,核心线程已经不足以来处理这么多请求,因此需要创建更多的线程,这个最大线程数就是就是系统线程池允许的线程峰值

keepAliveTime 存活时间

当线程池中的线程数大于核心线程数,且超出核心线程数的那部分线程中的空闲线程空闲多久会被回收释放

unit 存活时间的单位

workQueue 异步任务阻塞队列

当请求过大,最大线程数的线程还不足以及时处理,那些等待被处理的请求会被存放在异步任务阻塞队列中等待线程处理,我们可以使用 BlockingQueue 接口的实现类,例如:LinkedBlockingQueue阻塞队列,但我们不要使用其默认的初始化容量,而推荐自己根据系统的吞吐量设置一个合适的初始化容量,因为LinkedBlockingQueue 的默认初始化容量为Integer类型的最大值,该值过大容易导致内存爆满。

总结:在上面的四种线程创建方式中,推荐使用线程池的方式来创建线程,其优势如下:

1、降低系统资源的消耗,通过重复利用提前创建好的线程可以降低线程频繁的的创建和销毁。

2、提高系统的响应速度,由于线程池提前创建好了一批线程,所以当请求到来时就可以立马处理,而不需要等待线程创建。

3、方便管理线程, 线程池会根据当前系统特点对池内的线程进行优化处理 通过线程池我们可以动态的定义系统的线程大小,线程的存活时间等等。

ThreadPoolExecutor线程池的使用方法 主要为大家详细介绍了ThreadPoolExecutor线程池的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 立即下载

相关推荐

Java多线程之并发工具类

一、总论:在JDK中提供了几种并发工具类   1)CountDownLatch(同步倒数计数器:等待多线程(或者多步骤)完成)   2)CyclicBarrier(循环屏障:同步屏障)   3)Semaphore(信号量:控制并发进程数)   主要参考资料:java并发编程的艺术、Java并发——同步工具类   二、CountDownLatch(同步倒数计数器)–不仅仅用于多线程   1.作用:允许一个或多个线程等待其他线程完成操作。   CountDownLatch的构造函数接受一个int类的参数作为计数器,如果你想等待N个节点完成,那这里传入N.   2.countDown

创建线程池工具类

拒绝策略:ThreadPoolExecutor.DiscardPolicy,即直接丢弃任务不做处理。任务队列:LinkedBlockingQueue,容量为QUEUE_CAPACITY。线程工厂:为每个新线程设置名称前缀"lwc-pool-"和一个自增的编号。线程保持活跃时间:KEEP_ALIVE_SECONDS。时间单位:TimeUnit.MILLISECONDS。这个线程池用于执行提交的Runnable任务。核心线程数:CORE_POOL_SIZE。最大线程数:MAX_POOL_SIZE。

weixin_49423223的博客 465

complier lab2

只需支持定义 main 函数即可不带参数 int main(){...}带参数 int main(int argc, int argv){...}

qq_43581843的博客 904

创建线程的几种方法

实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值,后者线程执行体run()方法无返回值,因此可以把这两种方式归为一种这种方式与继承Thread类的方法之间的差别如下:1、线程只是实现Runnable或实现Callable接口,还可以继承其他类。2、这种方式下,多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形。3、但是编程稍微复杂,如果需要访问当前线程,必须调用Thread.currentThread()方法。

wang_luwei的博客 340

Windows系统下复现PointNet++算法

本文详细介绍了如何在Windows系统下复现PointNet++算法,内容包括程序下载、环境配置、数据集准备以及三个主要任务(语义分割、分类、部件分割)的实现步骤和常见报错解决方法。通过遵循本文的指导,用户可以顺利完成PointNet++算法的复现。

LingYi_5的博客 4326

sldd数据字典导出为excel

sldd导出为excel

zpfjf的博客 2237

创建线程三种方法

null :池中一直保持的线程的数量,即使线程空闲也不会释放。除非设置了 allowCoreThreadTimeOut *池中允许的最大的线程数当线程数大于核心线程数的时候,线程在最大多长时间没有接到新任务就会终止释放, 最终线程池维持在 corePoolSize 大小时间单位阻塞队列,用来存储等待执行的任务,如果当前对线程的需求超过了 corePoolSize大小,就会放在这里等待空闲线程执行。创建线程的工厂,比如指定线程名等。

一个菜鸡的博客 5958

【FPGA】Robei EDA 的使用(7)—— Robei文件上板试验

#沐朝露兮以自华,觅大道兮以求成 我又滚过来了,研究了20多天RISCV,结果最后因为硬件问题导致无法在比赛中使用RISCV CPU,虽然已经临近比赛后期了,非常的崩溃,但是也没有什么办法。唉,一切不过是从头再来罢了。(写写博客舒缓我心中苦闷) ————————————————进入正文的分割线———————————————— 今天介绍一下如何利用 Robei EDA 生成文件,导入vivado中,综合下载到开发板里。拿我一个PWM控制舵机的代码为例。 Robei EDA设置 假设代码模块(model文件)经

Ninquelote的博客 2561

创建线程的4种方法

线程创建主要有以下几种方法:1.继承Thread2.实现Runnable3.基于lambda4.实现callable

LxinY213的博客 2622

华为OD新系统机试真题 - 配置操作失败数量统计

华为OD机试新系统 4月8号【配置操作失败数量统计】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【配置操作失败数量统计】。

qq_45776114的博客 1158

VCAST创建单元测试工程

选择工作目录,后面创建胡UT工程将会生成到这个目录。

qq_42851449的博客 2479

创建线程的四种方式

无

m0_58473539的博客 5649

把 Client 当成 ABAP 系统的多租户底座:从 sy-mandt 到 CDS_CLIENT 的隔离机制与工程实践

本文深入解析SAP ABAP系统中Client概念的本质与应用。Client不仅是数据表的MANDT字段,更是会话级别的隔离边界,贯穿用户登录、授权和数据访问控制全过程。文章从ABAP SQL的隐式Client处理机制出发,详细介绍了USING CLIENT、USING ALL CLIENTS等安全跨客户端访问方式,并对比了传统CLIENT SPECIFIED的风险。同时阐述了ABAP CDS中@ClientHandling注解的类型与算法选择,包括#AUTOMATED自动拼接和#SESSION_VARIA

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 182

线程创建的三种方式和线程池创建的四种方式

线程创建的方式和区别 1.继承Thread类 (1)创建Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 (2)创建了Thread子类的实例,即创建了线程对象。 (3)调用线程对象的start()方法来启动该线程。 package com.thread; public class Thread01 { public static void main(String[] args) { MyThread01 t

chaochao2113的博客 1万+

告别定位不准!Inner-IoU助力YOLOv11边界框回归精度飙升

Inner-IoU 凭借辅助边框的创新设计,成功解决了传统 IoU 损失在小目标、遮挡场景下的收敛难题,为 YOLOv11 注入了更强的定位能力。从原理剖析到代码集成,本教程已为你铺就了一条“精度提升”的实战路径。现在,不妨亲自上手尝试,让你的目标检测模型在各类数据集上都能交出一份“精度优异”的答卷——相信我,当你看到检测框精准贴合目标的那一刻,你会明白这份尝试的价值。

FJN110的博客 188

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

线程池的7中创建方式

当执行很多较短时间的任务时,其线程的复用率比较高,会显著提升性能,而线程60s后会回收,意味没有任务进来,

爱开发的高高 2877

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【多线程】线程的三种常见创建方式

不能直接去调用run方法,如果直接调用run方法就不认为是一条线程启动了,而是把Thread当做一个普通对象,此时run方法中的执行的代码会成为主线程的一部分。此时执行结果是这样的。**线程其实是程序中的一条执行路径。** **那怎样的程序才是多线程程序呢?** 例如12306网站就是支持多线程的,因为同时可以有很多人一起进入网站购票,而且每一个人互不影响。再比如百度网盘,可以同时下载或者上传多个文件。这些程序中其实就有多条执行路径,每一条执行执行路径就是一条线程,所以这样的程序就是多线程程序。下面会逐一介

qq_45858191的博客 1468

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

线程池7种创建方式

一 线程的缺点 1:现成的创建需要开辟内存资源:本地方法栈,虚拟机 2: 3: 二 线程池 1.定义:使用池化技术来管理和使用线程的技术 2.线程池的创建方式(共7种): (1)创建固定个数的线程池 ExecutorService service = Executors.newFixedThreadPool(4); 问题:创建了十个线程来执行2个任务,那当前程序创建了几个线程? (2)创建带缓存的线程池 public class ThreadPoolDemo3 { public static vo

weixin_52012588的博客 1591

JAVA创建线程的方式

java 创建线程 线程池

weixin_44254397的博客 1319

线程的4种创建方式

多线程创建的4种方式

激流丶的博客 3764

java创建线程的4种方式

在Java中,创建线程有多种方式,每种方式都有其适用场景和优缺点。

m0_56341622的博客 3208

Java 线程创建方式

文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 本篇文章主要是记录Java线程的几种创建方式,以便需要的时候用来参考 一、创建方式说明 Java线程的创建方式有3种,分别是继承Thread,实现Runnable接口,通过Callable和Future接口创建(JDK1.5中开始增加)。还是有一种说法创建线程方式有4种,这4种除了前边提出的3种以外还有一种是通过线程池的方式创建线程。 二、继承Thread方式 1.代...

lcgskycby的博客 1108

线程创建的4种方式

这4种方式都可以用来创建线程,但是使用的场景和优缺点不同。继承Thread类和实现Runnable接口是最基本的两种方式,使用Callable接口可以获取线程执行结果,使用线程池Executor框架可以更好地管理和复用线程,提高性能和效率。需要根据具体的业务场景和需求选择合适的方式。

weixin_36873225的博客 751

创建线程的三种方式

一、是继承Thread方法;首先继承Thread方法,重写Thread的run()方法public class MyThread extends Thread{ @Override public void run() { // TODO Auto-generated method stub //super.run(); doSomething(); } private ...

Mr.Xie的博客 2万+

线程的创建方式

线程的六种创建方式。

ミカミミミ博客 692

创建线程的几种方式

Java中创建线程主要有三种方式: 一、继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 (2)创建Thread子类的实例,即创建了线程对象。 (3)调用线程对象的start()方法来启动该线程。 public class FirstThreadTest extends Thread { int i = 0; //重写run方法,run方法的方法体就是现场执行体

weixin_44602460的博客 1万+
上一篇: Nginx 常用配置汇总!
下一篇: 支付宝沙箱环境使用详解
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值