У меня есть два newSingleThreadScheduledExecutor, scheduleService1 и scheduleService2.
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
экземпляр?