线程池的4种拒绝策略
new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,new ThreadPoolExecutor.AbortPolicy())
1.ThreadPoolExecutor.AbortPolicy
线程池的默认拒绝策略为AbortPolicy,即丢弃任务并抛出RejectedExecutionException异常(即后⾯提交的请求不会放⼊队列也不会直接消费并抛出异常);
2.ThreadPoolExecutor.DiscardPolicy
丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃(也不会抛出任何异常,任务直接就丢弃了)。
3.ThreadPoolExecutor.DiscardOldestPolicy
丢弃队列最前⾯的任务,然后重新提交被拒绝的任务(丢弃掉了队列最前的任务,并不抛出异常,直接丢弃了)。
4.ThreadPoolExecutor.CallerRunsPolicy
由调⽤线程处理该任务(不会丢弃任务,最后所有的任务都执⾏了,并不会抛出异常)
使⽤最好使⽤默认的拒绝策略。
测试代码:
public class MainTest {
public static void main(String[] args) {
//核⼼线程数
int corePoolSize = 3;
//最⼤线程数
int maximumPoolSize = 6;
//超过 corePoolSize 线程数量的线程最⼤空闲时间
long keepAliveTime = 2;
/
/以秒为时间单位
生死别离TimeUnit unit = TimeUnit.SECONDS;
//创建⼯作队列,⽤于存放提交的等待执⾏任务
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(2);
ThreadPoolExecutor threadPoolExecutor = null;书痴
try {
//Executors.
//创建线程池
threadPoolExecutor = new ThreadPoolExecutor(corePoolSize,
maximumPoolSize,
keepAliveTime,
unit,
workQueue,
月经推迟几天查早孕
new ThreadPoolExecutor.CallerRunsPolicy());
重力的应用
//循环提交任务
for (int i = 0; i < 12; i++) {
行政岗位工作内容
//提交任务的索引
悲剧的意思final int index = (i + 1);
threadPoolExecutor.submit(() -> {
//线程打印输出
System.out.println("⼤家好,我是线程:" + index);
try {
/
/模拟线程执⾏时间,10s
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
市场部的职责//每个任务提交后休眠500ms再提交下⼀个任务,⽤于保证提交顺序
Thread.sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
threadPoolExecutor.shutdown();征东将军
}
} }