newSingleThreadExecutor

newSingleThreadExecutor

在我的应用程序中,我有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()

  • 我的问题:
  • 有什么理由让我比我更喜欢一个选项吗?
  • 用X线程生成线程池或生成X newSingleThreadExecutor是什么?
  • Pro et每种方法的对立面?
  • 最佳答案

    给定每个任务是一个无限循环,我将使用一个

    newCachedThreadPool();
    

    这将为需要它的每个任务创建一个线程(不再需要)

    每个使用单个线程池的好处是您可以单独关闭该池,也可以给每个线程命名,但是如果不需要,则只是开销。

    注意:您可以使用setName(“My task”)更改线程的名称,这可能对调试/概要分析很有用。

    使用ExecutorService的技巧之一是,它捕获任何未捕获的异常/错误,并将其放置在返回的Future对象中。通常,此Future会被丢弃,这意味着如果您的任务意外死亡,它也可能会静默地执行。

    我建议您在循环外进行try/catch(Throwable)并将其记录下来,以便可以查看线程是否意外死亡。例如OutOfMemoryError

    09-27 21:34