这是否可以接受"递归"并发设计

时间:2015-09-14 17:58:35

标签: java recursion concurrency

我想在并行工作线程中处理一些数据。但是,不是检查一个工作线程是否已完成然后分配新任务的父线程,而是希望线程自己加载数据并再次重新启动它们。

现在我想出了这个:

public class MainApp {

ExecutorService executor;


public synchronized void runNewWorkerThread(){

    //load the data to be processed in the threads from a file 

    executor.submit(()->{
        try{
            // process data (unstable)
        }catch(Exception e){
            //catch and log exception
        }finally{
            runNewWorkerThread();
        }

    });


}

}

现在这个rec​​ursivly重新启动了工作线程。这是一个可以接受的设计,还是我应该通过在runnable中做一些循环来保持工作线程活着?

如果这是一个可接受的设计,你会建议我使用哪个ExecutorService,为什么?

非常感谢,  FLO

编辑:启动的线程数是固定的,因为在线程中固定数量的实际设备是自动化的。但是,线程需要一个列表来顺序加载数据。

1 个答案:

答案 0 :(得分:1)

我认为您的代码很好。此外,您不应该遇到StackOverflowException,因为您没有直接调用方法runNewWorkerThread。您只需提交代码即可将runNewWorkerThread调用ExecutorServicesubmit函数调用将立即返回(具体取决于实现)。

务必正确启动工作人员。如果你想要,例如要并行运行的五个线程,您需要调用runNewWorkerThread方法五次,因为对runNewWorkerThread的每次调用在完成后只会启动一个新的runNewWorkerThread。此外,您应该只有一个MainApp对象,以确保synchronized关键字真正同步所有加载操作。

<强>更新

如果您使用例如newFixedThreadPool您可以确保不会遇到StackOverflowException,因为此ExecutorService一次只能运行固定数量的线程。这意味着,只有在完成其他任务之后,它才会执行另一个提交的任务。由于其他任务已完成,因此必须离开runNewWorkerThread方法。我希望这很清楚吗?