我正在阅读有关ThreadPoolExecutor的Oracles文档,特别是关于队列,以防请求多于可用的线程。但是我没有找到默认设置是什么。
要实例化执行器,我唯一要做的就是:
executor = Executors.newFixedThreadPool(numberOfThreads);
其中executor来自java.util.concurrent.ExecutorService,Executor是由java.util.concurrent.Executors给出的。
从那里开始,执行者再次出现的唯一行是:
executor.execute(worker);
如您所见,我从不设置有关执行程序正在使用的队列类型或大小的任何属性。
我想知道的是我链接的文档中描述的哪些策略正在使用。
通过我所展示的实现:我是否使用无限队列?它是有界的吗?如果是这样,默认大小是多少?
你只需要阅读javadoc:
public static ExecutorService newFixedThreadPool(int nThreads)
创建一个线程池,该线程池重用在共享的无限队列中运行的固定数量的线程。在任何时候,大多数 nThreads 线程都将是活动的处理任务。如果在所有线程都处于活动状态时提交其他任务,它们将在队列中等待,直到线程可用。
(强调我的)
如果你想要最大的灵活性,你可以使用ThreadPoolExecutor构造函数,它将让你选择你想要的每一个细节。
参见 Executors src
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor (nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue <Runnable >());
}
正如我们所看到的,它是无限的 LinkedBlockingQueue