Служба Executor и Main Thread не выполняются параллельно - PullRequest
0 голосов
/ 08 июня 2018

У меня есть требование, чтобы основной поток и служба Executor выполнялись параллельно.Основной поток не должен ждать завершения всех потоков в службе исполнителя.Он должен продолжить выполнение, пока служба-исполнитель выполняет свои потоки.Пример Основной метод

public static void main(String[] args) throws InterruptedException, ExecutionException {
        String mess = "test completed";
        //Start of ExecutorService - ThreadPool of size 500
        ExecutorService executorService = Executors.newFixedThreadPool(500);
        //Creating 500 tasks to execute
        List<AsyncTask> callables = new ArrayList<>();
        for(int i=1 ; i<= 500 ; i++){
            callables.add(new AsyncTask(i));
        }
        //Submitting all 500 tasks to execute
        List<Future<String>> futures = executorService.invokeAll(callables);
        for(Future<String> future : futures){
            System.out.println("future.get = " + future.get());
        }
        executorService.shutdown();
        //End of Executor service

        //Below code executes only when executor service is finished.
        //I want below code to execute in parallel with executor service
        //Means It should print this mess before executor service finishes
        System.out.println(mess);
    }

Вызываемое задание

public class AsyncTask implements Callable<String>{
    private int i;
    public AsyncTask(int i) {
        this.i = i;
    }
    @Override
    public String call() throws Exception {
        return "Task " +i;
    }
}

OutPut:

future.get = Task 1
future.get = Task 2
future.get = Task 3
future.get = Task 4
.......continues till
future.get = Task 500
test completed

Ожидаемый вывод:

проверка завершенного сообщения, которое будет напечатано во времянекоторые асинхронные задачи завершены или перед запуском асинхронных задач

Пример вывода

future.get = Task 1
future.get = Task 2
test completed       // Both Main method and Executor service is running in parallel
future.get = Task 3
...........
future.get = Task 500

Я раньше не работал с потоками, я что-то пропустил?Вся идея использования сервиса executor состоит в том, чтобы выполнять некоторые задачи параллельно с основным потоком, верно?Пожалуйста, предложите мне исправить это

1 Ответ

0 голосов
/ 08 июня 2018

ExecutorService.invokeAll будет ждать, пока все задачи не будут выполнены, поэтому весь код после этого не будет выполняться, пока не будет возвращено ExecutorService.invokeAll.Поместите код выполнения службы в другой поток, это просто решит проблему.

class RunService extends Thread {
     RunService () {
     }

     public void run() {
         //Start of ExecutorService - ThreadPool of size 500
         ExecutorService executorService = Executors.newFixedThreadPool(500);
         //Creating 500 tasks to execute
         List<AsyncTask> callables = new ArrayList<>();
         for(int i=1 ; i<= 500 ; i++){
             callables.add(new AsyncTask(i));
         }
         //Submitting all 500 tasks to execute
         List<Future<String>> futures = executorService.invokeAll(callables);
         for(Future<String> future : futures){
             System.out.println("future.get = " + future.get());
         }
         executorService.shutdown();
         //End of Executor service
     }
 }

public static void main(String[] args) throws InterruptedException, ExecutionException {
    String mess = "test completed";

    RunService rs = new RunService();
    rs.Start();

    //Below code executes only when executor service is finished.
    //I want below code to execute in parallel with executor service
    //Means It should print this mess before executor service finishes
    System.out.println(mess);
}
...