我想在并行工作线程中处理一些数据。但是,我希望不是由父线程来检查一个工作线程是否已完成,然后分配新任务,而是让线程自己加载数据并再次重新启动自己。
现在这是我想出的:
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();
}
});
}
}
现在这可以递归地重新启动工作线程。这是可以接受的设计,还是应该通过在可运行对象内部进行某种循环来使工作线程保持活动状态?
如果这是可以接受的设计,您会推荐我使用哪个ExecutorService?为什么?
非常感谢,
浮点数
编辑:启动的线程数是固定的,因为在线程中,固定数量的实际设备是自动进行的。但是,线程需要从一个列表中依次加载数据。
最佳答案
我认为您的代码很好。另外,您不应遇到StackOverflowException
,因为您不会直接调用方法runNewWorkerThread
。您只需提交代码以调用runNewWorkerThread
到ExecutorService
,并且submit
函数调用将立即返回(取决于实现)。
确保正确启动工作程序。如果你想要并行运行五个线程,您需要调用runNewWorkerThread
方法五次,因为对runNewWorkerThread
的每次调用将仅在完成后仅开始一个新的runNewWorkerThread
。另外,您应该只有一个MainApp
对象,以确保synchronized
关键字真正同步所有加载操作。
更新资料
如果您使用例如newFixedThreadPool,您可以确保不会遇到StackOverflowException
,因为该ExecutorService
一次只能运行固定数量的线程。这意味着,它将在另一个任务之一完成后仅执行另一个提交的任务。因为其他任务已完成,所以它必须已经离开了runNewWorkerThread
方法。我希望这足够清楚吗?
关于java - 这是可接受的“递归”并发设计吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32570982/