gpt4 book ai didi

java - 多个 newSingleThreadExecutor 与 ExecutorService 的 newFixedThreadPool

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:31 25 4
gpt4 key购买 nike

在我的应用程序中,我有 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 哪个更容易接受?

  3. 每种方法的优缺点?

最佳答案

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

newCachedThreadPool();

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

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

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

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

我建议您在循环外执行 try/catch(Throwable) 并记录它,这样您就可以查看线程是否意外终止。例如 OutOfMemoryError

关于java - 多个 newSingleThreadExecutor 与 ExecutorService 的 newFixedThreadPool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36398144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com