Как присоединить потоки к основному потоку в пуле потоков?

1

Я использую пул потоков для запуска задачи в другом процессе, чтобы присоединить все потоки к основному потоку, который я делаю, как показано ниже, но это занимает больше времени, чтобы дать результат. Как добиться этого эффективным способом.

        ExecutorService executor = Executors.newFixedThreadPool(2);
        Runnable sendded = new com.treamis.hr.employee.Sendded(filePath, academicyearmaster);
        executor.execute(sendded);

        Runnable employeeAttendanceReport = new EmployeeAttendanceReport(filePath2);
        executor.execute(employeeAttendanceReport);
        executor.shutdown();
        while (!executor.isTerminated()) {
        }
        System.out.println("Finished all threads");
  • 0
    Первый опрос о прекращении статуса исполнителя не является правильным. Вместо этого используйте метод awaitTermination (). Что касается времени завершения, то это зависит от того, сколько времени потребуется для выполнения запущенных задач. Не могли бы вы опубликовать код EmployeeAttendanceReport ?
Теги:
multithreading

2 ответа

2

Я буду использовать Future для этой задачи. Используйте executor.submit(yourrunnable) вместо executor.execute(yourrunnable) который вернет вам Future. Когда вы повторно используете эти будущие объекты как-то в главном потоке, вам придется ждать, пока все ваши потоки не будут выполнены.

[EDIT] Вот пример:

Future future = executorService.submit(new Runnable() {
    public void run() {
        System.out.println("Asynchronous task");
    }
});

future.get();  //returns null if the task has finished correctly.

(взято из http://tutorials.jenkov.com/java-util-concurrent/executorservice.html)

  • 1
    +1 и кстати: когда нужно отправить несколько задач, можно удобно поместить их в коллекцию и передать эту коллекцию в docs.oracle.com/javase/8/docs/api/java/util/concurrent/… - это будет ждать автоматически, пока все задачи не будут выполнены.
  • 0
    Как положить все предметы в коллекцию и вызвать.
0

Делая это, не останавливая работу, вы будете облагать налогом процессор, потому что он просто выполнит вызов этого метода так быстро, как только сможет, пока не вернется true.

Либо поставьте небольшой Thread.sleep, либо даже лучше, вызовите waitTermination у исполнителя

Я считаю, что есть примеры в http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

  • 0
    Не могли бы вы объяснить мне мой пример выше.
  • 0
    Обновил мой ответ, неверное имя метода
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню