请帮助理解并发问题。
我有以下代码用于执行线程:
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)时,我得到了excetd结果。
当我使用另一个线程计数时 - 每次我得到不同的结果。在我的情况下结果 - 输出到控制台。我明白,如果我使用很多线程,我可以得到不同的输出顺序,但我得到不同的内容!有时,内容不存在。看起来一个线程终止了,其他线程在那一刻就死了。
我在哪里可以搜索错误?在这个代码或更深的地方?
我在图片中看到了这种情况:
如果像这样重写代码:
@Override
public void run() {
synchronized ("123") {
processor.process(source);
}
}
它正在工作,但据我所知,它不是多线程的)
问题是线程池吞下异常。在processor.process(source);
和printStackTrace
答案 0 :(得分:1)
您使用的Processor
实现似乎不是线程安全的:您获得了1个线程的预期输出,但并未获得并行的多个线程。
在多线程环境中,该行为可能是意外的。
答案 1 :(得分:0)
this - > 关掉() 此方法不会等待先前提交的任务完成执行。使用awaitTermination()来做到这一点。
也许这就是问题?