Я использую пул потоков для запуска задачи в другом процессе, чтобы присоединить все потоки к основному потоку, который я делаю, как показано ниже, но это занимает больше времени, чтобы дать результат. Как добиться этого эффективным способом.
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");
Я буду использовать 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)
Делая это, не останавливая работу, вы будете облагать налогом процессор, потому что он просто выполнит вызов этого метода так быстро, как только сможет, пока не вернется true.
Либо поставьте небольшой Thread.sleep, либо даже лучше, вызовите waitTermination у исполнителя
Я считаю, что есть примеры в http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
EmployeeAttendanceReport
?