【发布时间】:2014-08-18 09:33:50
【问题描述】:
请帮助理解并发问题。
我有以下线程执行代码:
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),我得到了预期的结果。
当我使用另一个线程计数时 - 每次我得到不同的结果。就我而言,结果 - 输出到控制台。我知道如果我使用很多线程,我可以获得不同的输出顺序,但我会得到不同的内容!!!有时,内容不存在。看起来一个线程终止了,而其他线程在那一刻死亡。
我在哪里可以搜索错误?在这段代码或更深的地方?
我在图片上看到了这种情况:
更新:
如果像这样重写代码:
@Override
public void run() {
synchronized ("123") {
processor.process(source);
}
}
它正在工作,但据我了解它不是多线程)
更新
问题是线程池吞下了异常。在processor.process(source); 和 printStackTrace 中捕获 throwable 后,我可以解决我的问题
【问题讨论】:
-
所以你很可能有非线程安全的代码。但是我们应该如何在不知道您的代码的情况下找到您的错误呢?不是
Executor负责使您的代码线程安全。 -
@Holger 好的。谢谢。现在我知道这段代码是正确的。
标签: java multithreading concurrency threadpool threadpoolexecutor