gpt4 book ai didi

java - 执行人服务。当所有线程都终止时如何等待

转载 作者:太空宇宙 更新时间:2023-11-04 06:42:47 25 4
gpt4 key购买 nike

请帮助理解并发问题。

我有以下用于线程执行的代码:

public void startPool(final Processor processor, Configuration config) {
ExecutorService pool = Executors.newFixedThreadPool(config.getThreadPoolSize());
for (final String source : config.getSourcePaths()) {
pool.submit(new Runnable() {

@Override
public void run() {
processor.process(source);

}
});
}
pool.shutdown();
}

当我使用 1 个线程时(config.getThreadPoolSize() 返回 1),我得到了expecetd 结果。

当我使用另一个线程数时 - 每次我都会得到不同的结果。就我而言,结果 - 输出到控制台。我知道,如果我使用很多线程,我可以获得不同的输出顺序,但我会得到不同的内容!有时,内容缺失。看起来一个线程终止了,其他线程在那一刻死亡。

哪里可以查找错误?在此代码或更深的地方?

我看到这种情况如图所示:

enter image description here

更新:

如果重写代码如下:

           @Override
public void run() {
synchronized ("123") {
processor.process(source);
}
}

它正在工作,但据我了解它不是多线程)

更新

问题是线程池吞下了异常。在 processor.process(source); 和 printStackTrace 中捕获 throwable 后,我可以解决我的问题

最佳答案

看来您使用的Processor实现不是线程安全的:您获得了1个线程的预期输出,但没有获得多个并行线程的预期输出。

在多线程环境中,该行为可能会出乎意料。

关于java - 执行人服务。当所有线程都终止时如何等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24449024/

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