Блокирует ли метод service.schedule () другие потоки? - PullRequest
0 голосов
/ 21 октября 2018

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

1 Ответ

0 голосов
/ 21 октября 2018
ScheduledFuture<?> result1 = scheduledService1.schedule(task1, 5, TimeUnit.SECONDS);

Ни планирование task1, ни его выполнение не заблокируют вызывающий поток, так как scheduledService1 использует свой собственный фоновый пул потоков.

Но вызов get для Futureблокировать вызывающего до тех пор, пока результат не будет готов (т.е. запланированное задание выполнено до завершения):

System.out.println(result1.get()); // this will block for 5 seconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...