我正在使用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。因此,应该创建一个新线程。 相反,它使用的是前一个帖子
答案 0 :(得分:0)
您已将最大和最小线程数设置为1,因此将忽略超时,因为永远不会有任何其他线程超时。
您提供的输出没有意义,因为第二次没有线程名称。此外,如果您的线程已停止并且创建了一个新线程,则会将其称为pool-1-thread-2