service.schedule()方法是否阻止其他线程运行?

时间:2018-10-21 10:09:31

标签: java concurrency

我有两个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实例吗?

1 个答案:

答案 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