2014-07-01 129 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