Java中线程池实现的两种方式

本文介绍了Java中线程池的两种实现方式:ThreadPoolExecutor和Executors。线程池能有效管理和复用线程,提高效率。ThreadPoolExecutor允许自定义关键参数,如核心线程数、最大线程数、存活时间等,提供了execute()和submit()方法执行任务。Executors提供便利的方法创建线程池,如newFixedThreadPool、newSingleThreadExecutor等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

01 线程池的应用场景

(1)应用

比如现在收集上的修图软件。一张 1920 x1080 的图片有 200多万个像素点,对整个图片的每个像素点处理一遍也是需要不少的计算量。

(2)服务器端

服务器端处理大数据、大量请求时如果只是单个线程来进行,也是无法满足需求的。

此外,不管是处理应用还是服务器,即使使用了多线程,如果频繁进行创建和销毁线程,最终创建和销毁的时间有可能大于真正执行的时间。将对象复用是一个不错的选择,因此可以选择线程池。

线程池涉及到的常用的 Java 类包括 ThreadPoolExecutor、Executors 等。

02 ThreadPoolExecutor

(1)ThreadPoolExecutor 创建对象较为复杂,如下图是在 JDK 11 中提供的几个构造函数。

在这里插入图片描述

这些参数主要涉及到线程池一些关键参数的设置。以参数最多的这个构造函数为例:

public ThreadPoolExecutor(int corePoolSize, 
						  int maximumPoolSize, 
						  long keepAliveTime, 
						  TimeUnit unit, 
						  BlockingQueue<Runnable> workQueue, 
						  ThreadFactory threadFactory, 
						  RejectedExecutionHandler handler) {
   
	...
}

corePoolSize 空闲时线程池中保存的线程数。

maximumPoolSize 线程池中允许的最大线程数。

keepAliveTime 当有空闲线程时,且现有的线程数大于 corePoolSize 在超过该指定的时间则删除该线程,在指定的时间内并不删除线程。

unit 指设置的 keepAliveTime 的时间单位。

workQueue 执行前用来保存任务队列。

threadFactory 指定创建自定义线程的工厂类。

handler RejectedExecutionHandler 的作用是当线程池关闭之后如有任务加入的时候,可以实现一些处理,例如将被拒绝的线程信息记录下来。

(2)execute() 和 submit() 方法

两者都是能像线程池提交任务的,但是细节会有不同。

execute() 可以添加一个任务,但是类型只能是Runnable 类型,且该任务不能返回结果。当遇到自线程异常时,直接打印异常信息,主线程无法捕获异常信息。

submit() 可以添加一个任务,但是返回一个 Future 对象,并能够通过 Future 获得返回结果。当遇到异常时,能够在主线程中捕获异常信息。

submit() 方法的参数涉及到两类 callable 接口和 Runnable ,它们的主要区别是:

(a)Callable 接口的 call() 方法可有返回值,而 Runnable 接口的 run() 方法没有返回值。

(b)Callable 接口的 call() 方法可以生命抛出异常,而 Runnable 接口的 run() 方法不可以声明抛出异常。

(3)其他常用方法

shutdown() 主线程立即结束,且不会阻塞,线程池中为执行完的线程会继续执行,线程池中不在添加新的 Task,线程池会继续运行知道线程都执行完成。

当线程会立即编程 SHUTDOWN 状态,此时不再想线程池中添加 Task,否则抛出 Rejec

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值