我正在使用线程池在不同的进程中运行任务,将所有线程加入到我正在做的主线程中,但是它花了更多的时间来给出结果。如何以高效的方式实现这一点
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 :(得分:2)
我会使用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 :(得分:0)
通过在不关闭的情况下执行此操作,您将对CPU征税,因为它将尽可能快地执行该方法调用,直到它返回true。
要么放一个小的Thread.sleep,要么更好,在执行器上调用awaitTermination
我相信http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
中有一些例子