线程池
Posted leifonlyone
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池相关的知识,希望对你有一定的参考价值。
线程模型分类:
用户级线程(User-Level Thread,ULT)
用户程序实现,不依赖操作系统核心,应用提供创建、同步、调度和管理线程函数来控制用汉语线程。不需要用户态/内核态切换,速度快。内核对UTL无感知,线程阻塞则进程(包括它的所有线程)阻塞。
内核级线程(KLT)
系统内核管理线程,内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。在多处理器系统上,多线程在多处理器上并行运行。线程的创建,调度和管理部由内核完成,效率比UTL慢,比进程操作快。
线程池的意义:
线程是稀缺资源,他的创建与销毁是比较重且耗资源的操作。而java线程依赖于内核线程,创建线程需要进行操作系统状态切换,为避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配,调优与监控。
线程池优势:
- 重用存在的线程,减少线程创建,消亡的开销,提高性能
- 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行
- 提高线程的可管理性。线程是稀缺资源,如果无限制的创建不仅仅消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
线程池五种状态:
Running:能接收新任务,以及处理已经添加的任务
Shutdown:不接受新任务,可以处理已经添加的任务
Stop:不接受新任务,不处理已经添加的任务,并且中断正在处理的任务
Tidyingd:所有的任务已经终止,ctl记录的任务数量为0(ctl负责记录线程池的运行状态与活动线程数)
Terminated:线程池彻底终止,则线程池转化为terminated状态
源码:ThreadPoolExecutor execute
public void execute(Runnable command) {...
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
...}
addWorker{...
try {
w = new Worker(firstTask);
...}
Worker(Runnable firstTask) {
setState(-1); // inhibit interrupts until runWorker
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
} //创建线程并运行任务方法
合理配置线程池大小
处理器核心数:N CPU密集型(计算型)任务:N+1 IO密集型(读写)任务:2N+1
以上是关于线程池的主要内容,如果未能解决你的问题,请参考以下文章