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



我正在使用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(),如果我在同一执行器上再次调用任务,也应该停止线程并创建一个新线程。但是当我运行代码时,它给出了不同的输出。有人可以解释这种行为吗?代码如下:

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,因此将忽略超时,因为永远不会有任何其他线程超时。

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

相关内容

  • 没有找到相关文章

最新更新