如何使用 Java ExecutorService 线程池执行持续/无限任务?

par*_*uin 5 java concurrency

Java ExecutorService 框架允许您使用托管线程池委托要执行的多个任务,以便一次可以执行 N 个任务,直至完成。

我的问题是……如果 N 是一个无限大的数字,或者太大以至于最初分配/分配/定义不切实际怎么办?

如何利用 Java 中线程池的概念 (ExecutorService) 来处理比您可以合理提交的任务更多的任务,而不会耗尽资源。

出于此答案的目的,假设每个任务都是独立的,不依赖于任何其他任务,并且任务可以按任意顺序完成。

我最初尝试解决这个问题涉及一次向 ExecutorService Y 线程提供数据,但我很快意识到没有明显的方法来判断特定任务何时完成并因此提交要执行的新任务。

我知道我可以编写自己的“ExecutorService”,但我正在尝试利用 Java 框架已经提供的丰富功能。我通常属于“不要重新发明轮子”类别,因为比我更聪明的人已经为我进行了投资。

预先感谢任何能够提供有关如何解决此类问题的见解的人。

Cam*_*ner 3

你可以使用 aCompletionService来做到这一点。您可以使用一个线程为服务播种一系列任务,然后当任务完成时,您可以添加新任务。

一个简单的例子:

final CompletionService service = new ExecutorCompletionService(Executors.newFixedThreadPool(5));
Runnable taskGenerator = new Runnable() {
    public void run() {
        // Seed the service
        for (int i = 0; i < 100; ++i) {
            service.submit(createNewTask());
        }
        // As tasks complete create new ones
        while (true) {
            Future<Something> result = service.take();
            processResult(result.get());
            service.submit(createNewTask());
        }
    }
};
new Thread(taskGenerator).start();
Run Code Online (Sandbox Code Playgroud)

它使用ThreadPoolExecutor5 个线程来处理任务,并使用一个手工滚动的生产者/消费者线程来生成任务和处理结果。

显然,您需要比 更智能的东西while (true),您需要有processResult和的合理实现createNewTask,并且这假设任务执行比生成它们或处理结果慢得多。

希望这能让您走上正轨。