线程池:控制运行的线程数量,底层是阻塞队列。
- 线程复用(降低资源损耗)
- 控制最大并发数(提高响应速度)
- 管理线程(提高线程的可管理性)
线程池示例代码如下所示:
/**
* @author luffy
**/
public class ThreadPoolDemo {
public static void main(String[] args){
// System.out.println(Runtime.getRuntime().availableProcessors());
// ExecutorService service = Executors.newFixedThreadPool(5);
// ExecutorService service = Executors.newSingleThreadExecutor();
ExecutorService service = Executors.newCachedThreadPool();
try {
for (int i = 0; i < 10; i++) {
service.execute(()->{
System.out.println(Thread.currentThread().getName()+":处理业务");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
service.shutdown();
}
}
}
常用线程池如下:
- Executors.newCacheThreadPool()
- Executors.newFixedThreadPool(int n)
- Executors.newSingleThreadExecutor()
ThreadPoolExecutor类结构图如下所示:
![](https://img.haomeiwen.com/i17524543/e1166f63fceeb997.png)
线程池ThreadPoolExecutor构造方法7大参数:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
- corePoolSize-线程池核心线程数最大值
- maximumPoolSize-线程池线程总数最大值(核心线程+非核心线程)
- keepAliveTime-非核心线程闲置超时时长(多余空闲线程存活时间)
- unit-时间单位
- workQueue-线程池任务队列
- threadFactory-创建线程方式,默认
- handler-拒绝处理策略(4种)
拒绝处理策略如下:
- ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出-RejectedExecutionException异常。 (默认)
- ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)。
- ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。
线程池任务执行过程如下所示:
![](https://img.haomeiwen.com/i17524543/5277fef205f6f17c.png)
线程池状态转化图如下所示:
![](https://img.haomeiwen.com/i17524543/27788ddd2fc9b1aa.png)
![](https://img.haomeiwen.com/i17524543/700860394785f07f.png)
手写线程池示例代码如下所示:
/**
* @author luffy
**/
public class ThreadPoolDemo {
public static void main(String[] args) {
ExecutorService service = new ThreadPoolExecutor(
5,
10,
2L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(5),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy());
// new ThreadPoolExecutor.AbortPolicy()
// new ThreadPoolExecutor.CallerRunsPolicy()
// new ThreadPoolExecutor.DiscardOldestPolicy()
// new ThreadPoolExecutor.DiscardPolicy()
try {
for (int i = 0; i < 30; i++) {
service.execute(()->{
System.out.println(Thread.currentThread().getName()+":银行柜台处理业务!");
});
}
}finally {
service.shutdown();
}
}
}
线程池参数配置:
- CPU密集型:任务需要大量的计算,没有阻塞,CPU一致全速运行;公式:CPU核数+1个线程的线程池。
- I/O密集型:公式:2*CPU核数;公式:CPU核数/(1-阻塞系数),阻塞系数在0.8~0.9之间。
//获取PCU核数
Runtime.getRuntime().availableProcessors()
进一步研究CompletionService:
网友评论