Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Executors.newSingleThreadExecutor()线程处于活动状态,尽管超时为0L_Java_Multithreading_Executorservice_Executors - Fatal编程技术网

Java Executors.newSingleThreadExecutor()线程处于活动状态,尽管超时为0L

Java Executors.newSingleThreadExecutor()线程处于活动状态,尽管超时为0L,java,multithreading,executorservice,executors,Java,Multithreading,Executorservice,Executors,我使用的是Executors.newSingleThreadExecutor,我对它的工作原理有点困惑。比方说,我不是在呼吁关闭。我查看了可用的源代码 上面写着: public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,

我使用的是Executors.newSingleThreadExecutor,我对它的工作原理有点困惑。比方说,我不是在呼吁关闭。我查看了可用的源代码 上面写着:

public static ExecutorService  newSingleThreadExecutor() {
  return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,
     0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<Runnable>()));
}

我认为第4行中的旧名称应该是pool-1-thread-1,因为现有线程的超时为0L。因此,应该创建一个新线程。相反,它使用的是上一个线程

您已将最大和最小线程数设置为1,因此将忽略超时,因为不会有任何额外的线程超时


您给出的输出没有意义,因为第二次没有线程名称。另外,如果您的线程停止并创建了一个新线程,它将被称为pool-1-thread-2

我不太明白您的意思。初始代码来自Executors源代码。所以,如果我将最大和最小线程数写入1,那么超时参数就无关紧要了?第二次线程名称与我第一次设置的线程名称相同,因此我知道它使用ThreadPoolExecutor API文档中的旧线程:如果池当前有多个corePoolSize线程,那么如果多余线程的空闲时间超过keepAliveTime请参阅GetKeepAliveTimeUnit。超时用于多余的线程,即在核心线程之上创建的线程。您将核心池大小定义为1,最大值定义为1,这样就不会有多余的线程被终止。@SubhomoySikdar所以这就是我希望发生的事情。如果没有线程超时,则超时不适用。谢谢P.J.Meisch。keepAliveTime适用于超过核心大小的多余线程。无论如何,如果我不调用shutdown来计算核心线程将保持活动多长时间?或者我认为它们将/应该无限期地存在,因为这是核心大小,所以池将始终保持该数量的线程。@PeterLawrey:我想我需要ThreadFactory构造函数版本。从来没有用过,可能会派上用场,谢谢你的提示。
public static void main(String[] args) throws InterruptedException, ExecutionException {
    ExecutorService es = Executors.newSingleThreadExecutor();
    Future<String> f = es.submit(new MyService());
    System.out.println(f.get());
    System.out.println("Done executing 1st run");
    Thread.sleep(3000);
    f = es.submit(new MyService());
    System.out.println(f.get());
    es.shutdown();
}


public class MyService implements Callable<String>{

    @Override
    public String call() throws Exception {
        System.out.println("Old name: " + Thread.currentThread().getName());
        Thread.currentThread().setName("Mythread: " + Math.random());
        return Thread.currentThread().getName();
    }

}
Old name: pool-1-thread-1
Mythread: 0.061937241356848194
Done executing 1st run
Old name: Mythread: 0.061937241356848194
Mythread: 0.49829755639701667