package com.jerry.concurrency;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestCallerRunsPolicy {
public static void main(String[] args) throws InterruptedException {
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(1));//设置线程池只启动一个线程 阻塞队列一个元素
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//设置策略为选择线程执行
for (int i = 0; i < 10; i++) {
final int j = i;
pool.submit(new Runnable() {
public void run() {
System.out.println("线程:"+j + Thread.currentThread().getName()+" 开始执行");
try {
Thread.sleep(1000L);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("线程:"+j + Thread.currentThread().getName()+" 执行完毕");
}
});
}
Thread.sleep(5000L);
pool.shutdown();
System.out.println("关闭后线程终止了吗?" + pool.isTerminated());
}
}
线程:0pool-1-thread-1 开始执行
线程:2main 开始执行
线程:2main 执行完毕
线程:0pool-1-thread-1 执行完毕
线程:3main 开始执行
线程:1pool-1-thread-1 开始执行
线程:1pool-1-thread-1 执行完毕
线程:3main 执行完毕
线程:5main 开始执行
线程:4pool-1-thread-1 开始执行
线程:5main 执行完毕
线程:4pool-1-thread-1 执行完毕
线程:7main 开始执行
线程:6pool-1-thread-1 开始执行
线程:7main 执行完毕
线程:6pool-1-thread-1 执行完毕
线程:9main 开始执行
线程:8pool-1-thread-1 开始执行
线程:9main 执行完毕
线程:8pool-1-thread-1 执行完毕
关闭后线程终止了吗?false
这个policy看起来很有趣,
thread-1开始执行,main也开始执行,当main执行完毕后3进入队列,这时因为main是空闲的,所以3由main来执行,当thread-1中的0执行完后main也执行完了,此时5进入,选择了main来执行,我的理解是此时选择thread-1也是可以的,剩下的输出同理。