在我的应用程序中,我有4个不同的进程,这些进程永久性地运行,并稍有停顿。
当前版本的代码在单独的老式线程中执行每个进程:
Thread nlpAnalyzer = new Thread(() -> {
// infine lop for auto restore in case of crash
//noinspection InfiniteLoopStatement
while (true) {
try {
// this method should run permanently, pauses implemented internally
NLPAnalyzer.analyzeNLP(dbCollection);
} catch (Exception e) {
e.printStackTrace();
}
}
});
nlpAnalyzer.setName("im_nlpAnalyzer");
nlpAnalyzer.start();
现在,我想使用
ExecutorService
重构此代码。为此,我可以至少使用两种方法:newFixedThreadPool(numOfProc)
; numOfProc * newSingleThreadExecutor()
。 我的问题:
newSingleThreadExecutor
是什么? 最佳答案
给定每个任务是一个无限循环,我将使用一个
newCachedThreadPool();
这将为需要它的每个任务创建一个线程(不再需要)
每个使用单个线程池的好处是您可以单独关闭该池,也可以给每个线程命名,但是如果不需要,则只是开销。
注意:您可以使用setName(“My task”)更改线程的名称,这可能对调试/概要分析很有用。
使用ExecutorService的技巧之一是,它捕获任何未捕获的异常/错误,并将其放置在返回的
Future
对象中。通常,此Future
会被丢弃,这意味着如果您的任务意外死亡,它也可能会静默地执行。我建议您在循环外进行try/catch(Throwable)并将其记录下来,以便可以查看线程是否意外死亡。例如OutOfMemoryError