Будет ли выполнение потока продолжаться при ожидании Future одного потока - PullRequest
0 голосов
/ 04 января 2019

Я хочу знать, что когда программа ожидает объект Future одного потока, другие потоки продолжат свое выполнение.

Я пробовал приведенный ниже пример, похоже, когда моя программа ожидает один поток, другие потоки не продолжают свое выполнение. Пожалуйста, скажите мне, правильно ли это, или есть какие-то проблемы с моим кодом для обработки потоков.

ExecutorService executor = Executors.newFixedThreadPool(3);
for(int i=0; i<5 ;i++)
{
    Worker w = new Worker();
    Future<String> future = executor.submit(w);
    while(!future.isDone())
    {
        //Wait
    }
    String s = future.get();
    System.out.println(LocalDateTime.now()+" "+s);
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);

Ниже мой рабочий класс:

public class Worker implements Callable<String> {

@Override
public String call() throws Exception {
    // TODO Auto-generated method stub
    Thread.sleep(3000);
    return Thread.currentThread().getName();
}

}

Я получаю следующие результаты (добавлено время даты, чтобы показать, что результаты не параллельны):

2019-01-04T16:34:22.647 pool-1-thread-1
2019-01-04T16:34:25.661 pool-1-thread-2
2019-01-04T16:34:28.673 pool-1-thread-3
2019-01-04T16:34:31.685 pool-1-thread-1
2019-01-04T16:34:34.699 pool-1-thread-2

1 Ответ

0 голосов
/ 04 января 2019

Проблема

Вы представили код, который с точки зрения основного потока ожидает (2) для каждого выполнения перед отправкой нового задания (1).Другими словами: в главном потоке вы отправляете задачу, ожидаете полного выполнения в главном потоке и отправляете следующую задачу после.

ExecutorService executor = Executors.newFixedThreadPool(3);
for(int i=0; i<5 ;i++)
{
    Worker w = new Worker();
    Future<String> future = executor.submit(w); // (1)
    while(!future.isDone()) // (2)
    {
        //Wait
    }
    String s = future.get();
    System.out.println(LocalDateTime.now()+" "+s);
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);

Решение

Чтобы решитьпроблема, которую вы должны (с точки зрения основного потока) отправить все задачи без ожидания, а затем ждать результатов от службы исполнителя.

Пример: https://stackoverflow.com/a/49746114/1815881 Вы можете создать все задачи, затем вызвать invokeAll() в ExecutorService.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...