我有两个newSingleThreadScheduledExecutor,chedchedService1和ScheduledService2。
ScheduledExecutorService scheduledService1 = Executors.newSingleThreadScheduledExecutor();
Runnable task1 = () -> System.out.println("Hello zoo1");
Callable<String> task2 = () -> "Monkey";
ScheduledFuture<?> result1 = scheduledService1.schedule(task1, 5, TimeUnit.SECONDS);
System.out.println(result1.get());
Future<?> result2 = scheduledService1.schedule(task2, 5, TimeUnit.SECONDS);
System.out.println(result2.get());
Runnable task3 = () -> System.out.println("Hello zoo2");
ScheduledExecutorService scheduledService2 = Executors.newSingleThreadScheduledExecutor();
scheduledService2.schedule(task3, 5, TimeUnit.SECONDS);
//blocked by scheduledService1?
ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(() -> System.out.println("new single thread executor"));
System.out.println("main thread");
这将输出:
Hello zoo1
null
Monkey
main thread
new single thread executor
Hello zoo2
根据输出,似乎scheduledService1
阻塞了主线程和es
线程。为什么会这样呢?由于“ Hello zoo2”是最后打印的(来自scheduledService2
任务),为什么它也不会阻塞主线程和es
线程。这些毕竟在scheduledService2
声明之下。我的假设是正确的,即只有第一个ScheduledExecutorService
会阻止其他线程,而不是后续的ScheduledExecutorService
实例吗?
答案 0 :(得分:1)
ScheduledFuture<?> result1 = scheduledService1.schedule(task1, 5, TimeUnit.SECONDS);
由于task1
使用其自己的后台线程池,因此调度scheduledService1
或执行它都不会阻塞调用线程。
但是,在get
上调用Future
会阻塞调用者,直到结果准备就绪(即计划任务已运行完毕):
System.out.println(result1.get()); // this will block for 5 seconds