Java 遗嘱执行人服务。如何在所有线程终止时等待
请帮助理解并发问题 我有以下线程执行代码:Java 遗嘱执行人服务。如何在所有线程终止时等待,java,multithreading,concurrency,threadpool,threadpoolexecutor,Java,Multithreading,Concurrency,Threadpool,Threadpoolexecutor,请帮助理解并发问题 我有以下线程执行代码: public void startPool(final Processor processor, Configuration config) { ExecutorService pool = Executors.newFixedThreadPool(config.getThreadPoolSize()); for (final String source : config.getSourcePaths()
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)时,我得到ExpeetD结果
当我使用另一个线程计数时——每次我得到不同的结果。在我的例子中,result-输出到控制台。我明白,如果我使用了很多线程,我可以得到不同的输出顺序,但我得到的内容不同!!!有时,内容是不存在的。看起来一个线程终止了,另一个线程在那一刻死了
我在哪里可以搜索错误?在这个代码还是在更深的地方
我在图片上看到了这种情况:
更新:
如果像这样重写代码:
@Override
public void run() {
synchronized ("123") {
processor.process(source);
}
}
它正在工作,但据我所知,它不是多线程)
更新
问题是线程池会吞噬异常。我可以在
处理器.process(source)中捕捉到throwable之后解决我的问题
和printStackTrace您使用的处理器
实现似乎是非线程安全的:您可以获得一个线程的预期输出,但不能并行获得多个线程的预期输出
在多线程环境中,该行为可能是意外的。-->
关机()
此方法不会等待以前提交的任务完成执行。使用()来完成此操作
也许这就是问题所在?所以很可能是非线程安全代码。但是,在不知道代码的情况下,我们怎么能发现您的错误呢?使您的代码线程安全的不是
执行器。@Holger ok。谢谢现在我知道这个代码是正确的。在这种情况下,我的应用程序是挂起的