多个newSingleThreadExecutor与ExecutorService的newFixedThreadPool

时间:2016-04-04 08:49:17

标签: java multithreading concurrency threadpool executorservice

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

我的问题:

  1. 为什么我更喜欢一种选择而不是另一种选择?
  2. 生成具有X个线程的线程池或生成X newSingleThreadExecutor s?
  3. 的更多接受
  4. 赞成每种方法?

2 个答案:

答案 0 :(得分:4)

鉴于每个任务都是无限循环,我将使用的是

newCachedThreadPool();

这将为每个需要它的任务创建一个线程(而不是更多)

使用单个线程池的好处是你可以单独关闭池,或者为每个线程命名,但如果你不需要它,那只是开销。

注意:您可以使用setName(“我的任务”)更改线程的名称,这可能对调试/分析有用。

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

我建议你在循环外部进行try / catch(Throwable)并记录它,这样你就可以看到线程是否意外死亡。例如OutOfMemoryError

答案 1 :(得分:1)

除了关闭个别执行人之外,我没有看到以下选项的任何好处。

numOfProc * newSingleThreadExecutor()

但你有更多的选择。我更喜欢Executors中以下三个选项之一。

newFixedThreadPool
newCachedThreadPool
newWorkStealingPool

有关相关查询,请参阅以下SE问题:

Java's Fork/Join vs ExecutorService - when to use which?

How to properly use Java Executor?

Difference between Executors.newFixedThreadPool(1) and Executors.newSingleThreadExecutor()