Java中的线程池

news/2024/11/26 1:22:09/

为什么使用线程池?

线程池主要目的是为了重复利用线程,提高系统效率。Thread是一个重量级的资源,创建、启动以及销毁都是比较耗费系统资源的,因此对线程的重复利用一种是非常好的程序设计习惯,加之系统中可创建的线程数量是有限的,线程数量和系统性能是一种抛物线的关系,也就是说当线程数量达到某个数值的时候,性能反倒会降低很多,因此对线程的管理,尤其是数量的控制更能直接决定程序的性能。
--------------------------------------------------------------------读书笔记摘自书名:Java高并发编程详解:多线程与架构设计 作者:汪文君
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。
--------------------------------------------------------------------------读书笔记摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明

线程池原理 && 线程池处理流程

线程池的创建

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {if (corePoolSize < 0 ||maximumPoolSize <= 0 ||maximumPoolSize < corePoolSize ||keepAliveTime < 0)throw new IllegalArgumentException();if (workQueue == null || threadFactory == null || handler == null)throw new NullPointerException();this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;
}
参数功能
corePoolSize
核心线程数
线程池的大小
the number of threads to keep in the pool, even if they are idle.
maximumPoolSize
线程池最大数量
the maximum number of threads to allow in the pool.
keepAliveTimewhen the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.
unit可选的单位有天(DAYS)、小时(HOURS)、分钟(MINUTES)、毫秒(MILLISECONDS)、微秒(MICROSECONDS,千分之一毫秒)和纳秒(NANOSECONDS,千分之一微秒)。
BlockingQueue<Runnable> workQueuethe queue to use for holding tasks before they are executed. This queue will hold only the Runnable tasks submitted by the execute method.

线程池任务队列
threadFactory
创建线程的工厂
the factory to use when the executor creates a new thread
RejectedExecutionHandler handler
拒绝策略
the handler to use when execution is blocked because the thread bounds and queue capacities are reached

当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。

线程池饱和策略

向线程池提交任务

public interface Executor {void execute(Runnable command);
}
public interface ExecutorService extends Executor {Future<?> submit(Runnable task);
}
execute && submit
execute()方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功。
executorService.execute(new RunnableTask("任务"));
submit()方法用于提交需要返回值的任务。线程池会返回一个future类型的对象。

通过这个future对象可以判断任务是否执行成功,并且可以通过future的get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,而使用get(long timeout,TimeUnit unit)方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。
executorService.submit(new RunnableTask("任务"));
Future<String> future = executorService.submit(new CallableTask("name"));

关闭线程池

shutdown && shutdownNow
executorService.shutdown();
executorService.shutdownNow();
它们的原理是遍历线程池中的工作线程,然后逐个调用线程的 interrupt 方法来中断线程,所以无法响应中断的任务可能永远无法终止。但是它们存在一定的区别,shutdownNow 首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行暂停任务的线程,并返回等待执行任务的列表,而 shutdown 只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。
只要调用了这两个关闭方法中的任意一个,isShutdown 方法就会返回true。当所有的任务都已关闭后,才表示线程池关闭成功,这时调用 isTerminaed 方法会返回true。至于应该调用哪一种方法来关闭线程池,应该由提交到线程池的任务特性决定,通常调用shutdown方法来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow方法。

合理地配置线程池

-----------------------------------------------------------------------------读书笔记摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明

在这里插入图片描述


http://www.ppmy.cn/news/185453.html

相关文章

Java官方笔记4类和对象

创建类 定义类Bicycle&#xff1a; public class Bicycle {// the Bicycle class has// three fieldspublic int cadence;public int gear;public int speed;// the Bicycle class has// one constructorpublic Bicycle(int startCadence, int startSpeed, int startGear) {gea…

富士施乐Fuji Xerox WorkCentre 3325 驱动

富士施乐Fuji Xerox WorkCentre 3325 驱动是官方提供的一款一体机(打印、扫描)驱动&#xff0c;本站收集提供高速下载&#xff0c;用于解决一体机与电脑连接不了&#xff0c;无法正常使用的问题&#xff0c;本动适用于&#xff1a;Windows XP / Windows 7 / Windows 8 / Window…

富士相机设置传原图_【富士 X-E3 无反相机使用体验】蓝牙|WIFI|连接|图像传输_摘要频道_什么值得买...

富士 X-E3 无反相机使用体验(蓝牙|WIFI|连接|图像传输) 一&#xff0c;蓝牙和WIFI 特别说明&#xff1a;蓝牙和wifi连接的稳定性&#xff0c;和手机有很大的关系&#xff0c;我使用的是锤子坚果Pro手机&#xff0c;官方应用市场里没有富士的Camera Remote软件&#xff0c;和软件…

ubuntu fuji xerox scanner扫描仪安装和使用

打印功能可以直接添加&#xff0c;但是扫描功能不方便使用&#xff0c;无法简单使用&#xff1a; sudo sane-find-scannerscanimage -L 这两步完成配置&#xff08;未成功&#xff09;。 需要配置驱动&#xff0c;适用于18.04和20.04。 安装 对应于64位系统&#xff0c;使…

科技新品 | 军规级户外运动智能手表;本田赛车合作款金属计时表;富士影像数字印刷设备...

“科技新产品动态”栏目把新鲜的具有代表性的科学产品带到您眼前&#xff0c;涉及消费电子&#xff0c;半导体、服务器、智能家电等众多品类&#xff0c;提供图片和简单的文字介绍。 智能穿戴设备品牌Amazfit发布最新版户外运动智能手表系列&#xff1b;卡西欧与本田赛车联合推…

Ios面试题

http://lqcjdx.blog.163.com/blog/static/207489241201392282737189/ 看到这个关键字&#xff0c;我们就应该想到&#xff0c;这是Object-C对&#xff23;语言的扩展&#xff0c;例如interface XXX。 interface 声明类 implementation 实现类 protocol 声明协议 optio…

DICOM世界观·第二章 数字(D)、成像(I)与通讯(Co)

背景&#xff1a; 正如同笛卡尔定义了我们所生活在的三维世界和爱因斯坦定义了第四维度时间&#xff0c;在第一章中我们给出了统一的标定DICOM世界的坐标系&#xff0c;以及相关的变换理论&#xff0c;接下来我们要逐步走进DICOM世界内部&#xff0c;观察其内部的“真实景象”…

富士长焦机使用技巧

1、点测光怎么用&#xff1f; 点测光是从P档开始的手动档才有的测光方式&#xff0c;从AUTO开始的自动档没有。首先转到这些档&#xff0c;按相机最中间的那个功能键&#xff0c;出现调节菜单&#xff0c;然后用上下键调到测光处&#xff0c;再用左右键调到中间只有一个点的测光…