我想在并行工作线程中处理一些数据。但是,不是检查一个工作线程是否已完成然后分配新任务的父线程,而是希望线程自己加载数据并再次重新启动它们。
现在我想出了这个:
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();
}
});
}
}
现在这个recursivly重新启动了工作线程。这是一个可以接受的设计,还是我应该通过在runnable中做一些循环来保持工作线程活着?
如果这是一个可接受的设计,你会建议我使用哪个ExecutorService,为什么?
非常感谢, FLO
编辑:启动的线程数是固定的,因为在线程中固定数量的实际设备是自动化的。但是,线程需要一个列表来顺序加载数据。
答案 0 :(得分:1)
我认为您的代码很好。此外,您不应该遇到StackOverflowException
,因为您没有直接调用方法runNewWorkerThread
。您只需提交代码即可将runNewWorkerThread
调用ExecutorService
,submit
函数调用将立即返回(具体取决于实现)。
务必正确启动工作人员。如果你想要,例如要并行运行的五个线程,您需要调用runNewWorkerThread
方法五次,因为对runNewWorkerThread
的每次调用在完成后只会启动一个新的runNewWorkerThread
。此外,您应该只有一个MainApp
对象,以确保synchronized
关键字真正同步所有加载操作。
<强>更新强>
如果您使用例如newFixedThreadPool您可以确保不会遇到StackOverflowException
,因为此ExecutorService
一次只能运行固定数量的线程。这意味着,只有在完成其他任务之后,它才会执行另一个提交的任务。由于其他任务已完成,因此必须离开runNewWorkerThread
方法。我希望这很清楚吗?