《Java并发库系列四》一newFixedThreadPool

1、API介绍

Executors.newFixedThreadPool(10),创建一个固定大小的线程池。

两个构造方法

Executors.newFixedThreadPool(10);

Executors.newFixedThreadPool(10,Executors.defaultThreadFactory());

一个线程数量coreSize

一个线程数量,一个线程factory ThreadFactory

2、线程池逻辑:

1、当线程池的的正在运行线程数量 小于 coreSize 的时候,提交新的任务,会生成新的线程,直到最大值coreSize。

2、如果任务能成功的加入到队列中,需要重新检测,因为可能存活的线程已经结束或者线程池关闭了,这时候拒绝这个任务

注意:只有在提交任务的时候才会创建新的任务。创建了一个10个线程的线程池,提交了3个任务,运行的时候生成了三个线程。

ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.submit(()-> System.out.println("1111111111111111111111"));
executorService.submit(()-> System.out.println("222222222222222222"));
executorService.submit(()-> System.out.println("3333333333333333333333"));

3、题外话:移位操作和位运算

private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY   = (1 << COUNT_BITS) - 1;
private static int workerCountOf(int c)  { return c & CAPACITY; }

移位操作似乎很多程序不会。

<< 右移操作相当于*2的n次方

& 同为1 取1 其他取0

<< 右移操作,会在左边补全0,例如1 右移2为 变为 100

CAPACITY -1 会将所有的位数变为11,

在& 的时候会屏蔽超过这个CAPACITY -1 的值,相当于取Math.min(CAPACITY -1,c)

欢迎转载,我是香菜,谢谢。欢迎加入QQ群:632603498,一起学习

发布了98 篇原创文章 · 获赞 65 · 访问量 48万+

猜你喜欢

转载自blog.csdn.net/perfect2011/article/details/88822083
今日推荐