Java corePoolSize=0如何适用于ThreadPoolExecutor?
Java corePoolSize=0如何适用于ThreadPoolExecutor?,java,multithreading,executorservice,threadpoolexecutor,blockingqueue,Java,Multithreading,Executorservice,Threadpoolexecutor,Blockingqueue,ExecutorService.newCachedThreadPool()的定义是 public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
ExecutorService.newCachedThreadPool()的定义是
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(),
threadFactory);
}
公共静态执行器服务newCachedThreadPool(ThreadFactory ThreadFactory){
返回新的ThreadPoolExecutor(0,Integer.MAX_值,
60升,时间单位。秒,
新建SynchronousQueue(),
螺纹加工厂);
}
它正在创建一个池,其中包含corePoolSize=0
,maximumPoolSize=Integer.MAX_VALUE
和一个无界队列
但是,在forThreadPoolExecutor
中,它表示:
在方法execute(java.lang.Runnable)中提交新任务时,如果运行的线程少于corePoolSize,则会创建一个新线程来处理该请求,即使其他工作线程处于空闲状态如果运行的线程超过corePoolSize但小于maximumPoolSize,则仅当队列已满时才会创建新线程
那么在这种情况下,corePoolSize=0
是如何工作的呢?最初,有0个线程,所以虽然文档中没有说明,但我假设它将为提交的第一个任务创建一个新线程。但是,现在我们有了1个thread>corePoolSize=0,1个thread
所以没有新的线程会被创建,我们只能使用一个线程
不是真的
请注意newCachedThreadPool
使用:
一种阻塞队列,其中每个插入操作必须等待
另一个线程执行相应的删除操作,反之亦然。A.
同步队列没有任何内部容量,甚至没有
一个的容量
这意味着
- 如果有空闲工作线程试图获取队列的任务,则该任务将被成功地放入队列,并立即由该空闲线程执行
- 否则,此任务无法放入队列,换句话说,队列已满。然后将创建新线程来执行任务
您能否解释ThreadPoolExecutor
与LinkedBlockingQueue
和corePoolSize=0
的行为。根据文件,它不起作用。看看这个。