我正在使用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