Executors.newSingleThreadExecutor()线程是活着的虽然Timeout是0L

时间:2014-12-27 19:47:36

标签: java multithreading executorservice executors

我正在使用Executors.newSingleThreadExecutor(),我对它是如何工作有点困惑。我们假设我没有打电话给shutdown()。我查看了可用的源代码 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/Executors.java#Executors.newSingleThreadExecutor%28%29  它说:

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

所以,我的假设是在执行任务之后,即使我不调用shutdown(),如果我在同一个执行器上再次调用一个任务,则应该停止该线程并创建一个新的Thread。但是当我运行代码时,它给出了不同的输出。有人可以解释这种行为吗? 这是代码:

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

我认为第4行中的Old name:应为pool-1-thread-1,因为现有线程的超时时间为0L。因此,应该创建一个新线程。 相反,它使用的是前一个帖子

1 个答案:

答案 0 :(得分:0)

您已将最大和最小线程数设置为1,因此将忽略超时,因为永远不会有任何其他线程超时。

您提供的输出没有意义,因为第二次没有线程名称。此外,如果您的线程已停止并且创建了一个新线程,则会将其称为pool-1-thread-2