如何将线程连接到线程池中的主线程?

时间:2014-07-01 11:41:46

标签: java multithreading

我正在使用线程池在不同的进程中运行任务,将所有线程加入到我正在做的主线程中,但是它花了更多的时间来给出结果。如何以高效的方式实现这一点

        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");

2 个答案:

答案 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

中有一些例子