线程池(模拟银行办理业务)****(7大参数,4种拒绝策略)
import java.util.concurrent.*;
/**
* 4种拒绝策略
* new ThreadPoolExecutor.AbortPolicy()//拒绝策略,满了的话直接抛出异常java.util.concurrent.RejectedExecutionException
* new ThreadPoolExecutor.CallerRunsPolicy()//拒绝策略(满了的话就说我这人满了,你要办理你们公司的,去你们公司办理,哪来的回哪去)
* new ThreadPoolExecutor.DiscardPolicy()//拒绝策略(从阻塞队列丢弃最新的任务(队尾),不会抛出异常)
* new ThreadPoolExecutor.DiscardOldestPolicy()//拒绝策略(从阻塞队列丢弃最旧的任务(队首),不会抛出异常)
*/
public class ThreadPoolDemo {
public static void main(String[] args) {
//7大参数
ExecutorService threadPool = new ThreadPoolExecutor(
2, //核心池大小(银行开放2个窗口)
5, //最大池的大小(银行最多开放5个窗口)
3, //存活时间 (比如前两个窗口在营业,后3个在等待,这里的就是等待时间)
TimeUnit.SECONDS, //等待的时间单位
new LinkedBlockingDeque<>(3),//阻塞队列(模拟银行的候客区,有3个座位)
Executors.defaultThreadFactory(),//线程池创建Thread线程的工厂类。没有提供的话,就使用线程池内部默认的创建线程的方式
new ThreadPoolExecutor.CallerRunsPolicy()//拒绝策略(从阻塞队列丢弃最旧的任务(队首),不会抛出异常)
);
try {
//最大承载;Deque(阻塞队列--候客区椅子座位数,这里是3) + max(最大池大小---最多开放的窗口,这里是5)
//超过RejectedExecutionException
for (int i = 1; i <= 9; i++) { //这里可以从1-9逐个测试不同的拒绝策略会怎么样
final int tmp = i;
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+ " OK");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//线程池用完,程序结束,关闭线程池
threadPool.shutdown();
}
}
}
import java.util.concurrent.*;
public class ThreadPoolExecutorTest {
public static void main(String[] args) throws InterruptedException {
ExecutorService pool = new ThreadPoolExecutor(//线程池---快递公司
3,// 核心线程数(正式员工):创建好线程池,正式员工就开始取快递
// 临时工雇佣:正式员工忙不过来,就会创建临时工
// 临时工解雇:空闲时间超出设置的时间范围,就解雇
5,// 最大线程数(最多数量的员工:正式员工+临时工)
30,// 时间数量
TimeUnit.SECONDS,// 时间单位(时间数量+时间单位表示一定范围的时间)
// 阻塞队列:存放包裹的仓库(存放任务的数据结构)
new ArrayBlockingQueue<>(1000),
// (了解)线程池创建Thread线程的工厂类。没有提供的话,就使用线程池内部默认的创建线程的方式
// new ThreadFactory() {
// @Override
// public Thread newThread(Runnable r) {
// return null;
// }
// },
// 拒绝策略:
// CallerRunsPolicy:谁(execute代码行所在的线程)让我(快递公司)送快递,不好意思,你自己去送
// AbortPolicy:直接抛出异常RejectedExecutionException
// DiscardPolicy:从阻塞队列丢弃最新的任务(队尾),不会抛出异常
// DiscardOldestPolicy:从阻塞队列丢弃最旧的任务(队首),不会抛出异常
new ThreadPoolExecutor.DiscardOldestPolicy()
);
pool.execute(new Runnable() {
@Override
public void run() {
System.out.println("送快递到北京,A同学");
}
});
pool.execute(new Runnable() {
@Override
public void run() {
System.out.println("送快递到,B同学");
}
});
System.out.println("我正在做事情");
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- esig.cn 版权所有 湘ICP备2023023988号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务