gpt4 book ai didi

java - 执行器 corepoolsize 为零,具有有限的 LinkedBlockingQueue

转载 作者:行者123 更新时间:2023-11-30 09:13:43 24 4
gpt4 key购买 nike

我正在学习 Java 并发实践,并在 8.3.1 线程创建和拆卸部分下看到了一条语句。这是声明 - “即使没有要执行的任务,实现也会尝试将池保持在这个大小,并且不会创建比这更多的线程,除非工作队列已满。”为了验证相同,我写了一个小代码

package com.executor;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


public class MyJobSubmitterThread extends Thread {

public static ExecutorService objExecutorService = new ThreadPoolExecutor(0, 1, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(2));

public static int counter = 1;
@Override
public void run() {
//Using Runnable
while(!objExecutorService.isShutdown()){
try{
objExecutorService.execute(new RandomNumberGenerator());
if(counter > 10){
objExecutorService.shutdownNow();
if(objExecutorService.isTerminated()){
System.out.println("Runnable - Terminated");
}
//objExecutorService.execute(new RandomNumberGenerator());
}
int objBlockingQueueSize = ((ThreadPoolExecutor)objExecutorService).getQueue().size();
++counter;
}catch (RejectedExecutionException e) {
// TODO: handle exception
e.printStackTrace();
}
}

}
}

故意不放置 RandomNumberGenerator 类的代码,因为在这个问题的上下文中不需要。

按照上面引用的说法,除非第三个任务被提交到队列,否则线程不应该被创建和启动,但相反,线程被创建和启动。当线程在 10 秒后死亡keep alive time,它在刚提交作业时再次创建。当我查看 Java 1.7 源代码中的执行方法代码时,它就像

else if (workerCountOf(recheck) == 0)
addWorker(null, false);

有人可以解释为什么代码的行为与 JCIP 书中所述的行为不同,反之亦然吗?我在这里漏掉了一点吗?

最佳答案

书中的陈述是准确的,但需要注意的是,ThreadPoolExecutor 确保在有工作要做时至少有 1 个线程在运行(即 corePoolSize == 0 是一种特殊情况)。

关于java - 执行器 corepoolsize 为零,具有有限的 LinkedBlockingQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20935119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com