#java #multithreading
#java #многопоточность
Вопрос:
Я использую пул потоков для запуска задачи в другом процессе, чтобы присоединить все потоки к основному потоку, я делаю, как показано ниже, но для получения результата требуется больше времени.Как добиться этого эффективным способом.
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");
Комментарии:
1. Первый опрос статуса завершения исполнителя неверен. Вместо этого используйте метод awaitTermination(). Что касается времени завершения, это зависит от того, сколько времени требуется для остановки запущенных задач. Не могли бы вы, пожалуйста, опубликовать
EmployeeAttendanceReport
код?
Ответ №1:
Я бы использовал Future
для этой задачи. Используйте executor.submit(yourrunnable)
вместо executor.execute(yourrunnable)
, который вернет вам Future
. Когда вы каким-то образом повторно используете эти будущие объекты в своем основном потоке, ему придется подождать, пока все ваши потоки не будут выполнены.
[РЕДАКТИРОВАТЬ] Вот пример:
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 /… — это будет автоматически ждать, пока все задачи не будут завершены.
2. Как поместить все объекты в коллекцию и вызвать.
Ответ №2:
Делая это без завершения работы, вы будете нагружать процессор, потому что он просто выполнит вызов этого метода так быстро, как только сможет, пока не вернет true .
Либо поместите небольшой Thread.sleep, либо, что еще лучше, вызовите awaitTermination у исполнителя
Я полагаю, что есть примеры вhttp://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
Комментарии:
1. Не могли бы вы, пожалуйста, объяснить мне мой приведенный выше пример.
2. для обоих методов требуется время выполнения.
3. Исполнитель. завершение работы ожидает завершения всех запущенных заданий, если я правильно помню