newFixedThreadPool线程池模拟厕所排队
原创
©著作权归作者所有:来自51CTO博客作者chushiyunaaa的原创作品,请联系作者获取转载授权,否则将追究法律责任
newFixedThreadPool也是从ThreadPoolExecutor变化而来。 源码为:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
也就是初始化大小和最大值是相同值, 都是nThreads。
假设5个人要去厕所,只有2个位置。
期待效果是,最多只有2个人,其他人次依次排队。如果不加线程池,就是5个人一起。
代码:
@Slf4j
public class WashRoom implements Runnable {
private int n; // 用来记录第几个人
@Override
public void run() {
try {
log.info(n+" 开始");
int milliSecond = RandomUtils.createMilliSecond(1, 4); // 这里只要是随机秒数就行
Thread.sleep(milliSecond);
log.info(n +"结束,用时: "+milliSecond);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public WashRoom(int n){
this.n=n;
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
for (int i = 0; i < 5; i++) { // 5个人上厕所,只有2个位置
executorService.execute(new WashRoom(i));
}
executorService.shutdown(); // 别忘了关闭
}
}
newFixedThreadPool(1) 和 newSingleThreadExecutor 区别
newFixedThreadPool(1) 如果线程异常了,会产生一个新线程。
newSingleThreadExecutor 如果异常了,不会产生一个新线程。