package com.mqc.some;
import java.util.concurrent.*;
public class ThreadPoolTest {
public static void main(String[] args) {
ExecutorService executorService= new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
for(int i=0;i<4;i++){
System.out.println("submit:"+i);
int finalI = i;
try {
executorService.submit(()->{
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test:"+ finalI);
});
} catch (Exception e) {
e.printStackTrace();
}
}
executorService.shutdown();
}
}
AbortPolicy:抛出java.util.concurrent.RejectedExecutionException异常
这个异常会中断主线程后续执行过程,所以在循环体中trycatch了
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}
结果:
submit:0 //直接由线程池创建worker运行
submit:1 //进入等待队列
submit:2 //拒绝策略
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@1faab1 rejected from java.util.concurrent.ThreadPoolExecutor@171fc7e[Running, pool size = 1, active threads = 1, queued tasks = 1, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
at com.mqc.some.ThreadPoolTest.main(ThreadPoolTest.java:14)
submit:3 //拒绝策略
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@1f38edc rejected from java.util.concurrent.ThreadPoolExecutor@171fc7e[Running, pool size = 1, active threads = 1, queued tasks = 1, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
at com.mqc.some.ThreadPoolTest.main(ThreadPoolTest.java:14)
test:0
test:1
ExecutorService executorService= new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1),Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());
CallerRunsPolicy:直接由当前线程执行线程任务
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}
submit:0
submit:1
submit:2 //拒绝策略 由当前线程执行线程任务
test:0
test:2 //由于直接由当前线程执行 所以要比等待队列中的任务早执行
submit:3
test:1
test:3
ExecutorService executorService= new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1),Executors.defaultThreadFactory(),new ThreadPoolExecutor.DiscardPolicy());
DiscardPolicy:忽略后续加入的任务
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
什么也不做 就当无事发生~~
submit:0
submit:1
submit:2
submit:3
test:0
test:1
ExecutorService executorService= new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1),Executors.defaultThreadFactory(),new ThreadPoolExecutor.DiscardOldestPolicy());
DiscardOldestPolicy:将等待队列中等待最久的任务丢弃
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}
submit:0
submit:1
submit:2 //2 提交 则将队列中1丢弃
submit:3 //3 提交 则将队列中2丢弃
test:0
test:3