线程池的底层是阻塞队列,这一点需要注意。
ThreadPoolExecutor是重点
Executors是线程池的工具类。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MyThreadPoolDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
try {
for (int i=0;i<10;i++) {
executorService.execute(() -> {
System.out.println(Thread.currentThread().getName() + " 开始办理");
});
}
}catch (Exception e ){
e.printStackTrace();
}finally {
executorService.shutdown();
}
}
}
结果:
pool-1-thread-3 开始办理
pool-1-thread-5 开始办理
pool-1-thread-5 开始办理
pool-1-thread-3 开始办理
pool-1-thread-5 开始办理
pool-1-thread-5 开始办理
pool-1-thread-3 开始办理
pool-1-thread-2 开始办理
pool-1-thread-1 开始办理
pool-1-thread-4 开始办理
一池一个处理线程:
ExecutorService executorService=Executors.newSingleThreadExecutor();
可扩容的线程池(一池n个处理线程):
ExecutorService executorService=Executors.newCachedThreadPool();
底层初窥:
发现三者源码都是实现了一个ThreadPoolRxecutor。所以接着来看ThreadPoolRxecutor。
七大参数:
生活中的case:
1、corePoolSize:今天有多少个人属于正常值班。
2、maxmumPoolSize:网点一共能容许多少人同时值班。
3、4:keepAliveTime(时间)& unit(单位):加班人员没有工作量后多长时间可下班的规定时间。
5、workQueue:候客区(即阻塞队列)
6、threadFactory:网点的一些默认规范。
7、handler:人满为患时,如何拒绝再来办理业务的客人。
底层工作原理:
正常工作–>进入阻塞队列—>叫人加班—>拒绝策略
先看corePoolSize,再看阻塞队列,再看maximumpool,接着执行拒绝策略。
jdk内置的拒绝策略
是什么?
有哪些?
以上内置策略,均实现了RejectedExecutionHandler接口。
工具类中的那三个方法如果在工作中,你会用哪一个?
哈哈,被套路了吧。正确答案是一个都不用。
为什么不用呢?(无界阻塞队列,堆被瞬间 充满)
代码:
import java.util.concurrent.*;
public class MyThreadPoolDemo {
public static void main(String[] args) {
//ExecutorService executorService=Executors.newCachedThreadPool();
// ExecutorService executorService=Executors.newSingleThreadExecutor();
//ExecutorService executorService = Executors.newFixedThreadPool(5);
ExecutorService executorService =new ThreadPoolExecutor(2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy());
//new ThreadPoolExecutor.CallerRunsPolicy());
//new ThreadPoolExecutor.AbortPolicy());
//new ThreadPoolExecutor.DiscardPolicy());
try {
for (int i=1;i<=18;i++) {
executorService.execute(() -> {
System.out.println(Thread.currentThread().getName() + " 开始办理");
});
}
}catch (Exception e ){
e.printStackTrace();
}finally {
executorService.shutdown();
}
}
}
maxmumPoolSize+阻塞队列初始值应该为:?
io密集型:
CPU密集型: