2014-07-01 190 views
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'代碼嗎? – Kishore

回答

0

通過這樣做,雖然不關機,你會含稅CPU,因爲它只是執行方法調用一樣快,因爲它可以直到它返回true。

要麼把一個小的Thread.sleep甚至更好,呼籲awaitTermination在執行

我相信有在http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

+0

你能否用我上面的例子來解釋我。 – user3108190

+0

更新了我的回覆,錯誤的方法名稱爲 – Richo

+0

,這兩種方法都需要執行時間。 – user3108190

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

+1,並且BTW:當需要提交多個任務時,可以方便地將它們放入集合中,並將此集合傳遞給http:// docs。 oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#invokeAll-java.util.Collection- - 這將自動等待,直到所有任務完成。 – Marco13

+0

如何將所有對象放入集合中並調用。 – user3108190