1

主要的是回调应该在父线程上,而不是从正在完成工作的任务中调用(例如,不像 ThreadPoolExecutor 的 afterExecute() 钩子)。我想要类似的东西:

ExecutorService exec = Executors.newSingleThreadExecutor();
>>>>> exec.addAllJobsFinishedListener(someListener) <<<<<
exec.submit(task);

和 someListener 有一个像 allJobsFinished() 这样的 Overrideable 方法

4

2 回答 2

2

启动多个线程并在所有子线程完成后在父线程上运行回调的非阻塞方法

如果您想在 PARENT 线程上进行回调,那么恐怕您需要让父线程调用exec.awaitTermination(...). 在你提交了所有的作业exec.shutdown()并被调用之后,这会等待线程池中的所有作业完成。如果您希望它是非阻塞的,那么您将不得不在另一个线程中执行此操作(当然在不同的池中运行)。

我看不出它如何成为在非阻塞的父线程上运行的“侦听器。您可以有一个后台线程检查,它将在完成时更新某种共享状态(如AtomicBoolean)。trueexec.awaitTermination(...)

ThreadPoolExecutor确实有terminate()可以覆盖的方法。这不是你想要的吗?这是该方法的javadocs。您的代码将类似于:

ThreadPoolExecutor threadPool =
   new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS,
      new LinkedBlockingQueue()) {
     public void terminated() {
        super.terminated();
        // do something magic
     }
};
threadPool.execute(task);
// ...
// need to shutdown the pool after you've submitted all of the tasks
threadPool.shutdown();

如果“神奇的东西”代码设置了一个共享volatile boolean的或AtomicBoolean主线程可以检查的,那么它应该可以正常工作。

于 2013-10-02T20:16:57.593 回答
1

看起来ThreadPoolExecutor类对您来说确实是一个不错的选择,您可以调用getActiveCount()方法来检查正在运行的线程而不会被阻塞。还可以查看这篇文章,例如shutdown()isTerminated()这对我来说非常简单和好。

该解决方案未涵盖的是等待周期。某种睡眠应该可以解决这个问题。Condition可能和的标准组合Lock(查找 POSIX 条件变量示例)也是可以接受的解决方案,但它缺乏以前方法的美感。

寻找这个,我认为它适合你:

package com.journaldev.threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SimpleThreadPool {

    public static void main(String[] args) {

        ExecutorService executor = Executors.newFixedThreadPool(5);

        for (int i = 0; i < 10; i++) {
            Runnable worker = new WorkerThread('' + i);
            executor.execute(worker);
        }

        executor.shutdown();

        while (!executor.isTerminated()) {
            // Put other work or calls here...
        }
        System.out.println('Finished all threads');
    }
}

请注意以下事实:

  • executor.shutdown()只是阻止新线程的产生。
  • executor.isTerminated()不会阻止你。你可以自由地做其他工作。
于 2013-10-02T20:44:46.740 回答