执行人服务。如何在所有线程终止时等待

时间:2014-06-27 09:57:18

标签: 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()) {
                pool.submit(new Runnable() {

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

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

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

当我使用另一个线程计数时 - 每次我得到不同的结果。在我的情况下结果 - 输出到控制台。我明白,如果我使用很多线程,我可以得到不同的输出顺序,但我得到不同的内容!有时,内容不存在。看起来一个线程终止了,其他线程在那一刻就死了。

我在哪里可以搜索错误?在这个代码或更深的地方?

我在图片中看到了这种情况:

enter image description here

UPDATE:

如果像这样重写代码:

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

它正在工作,但据我所知,它不是多线程的)

更新

问题是线程池吞下异常。在processor.process(source);和printStackTrace

中捕获throwable之后,我可以解决我的问题

2 个答案:

答案 0 :(得分:1)

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

在多线程环境中,该行为可能是意外的。

答案 1 :(得分:0)

this - >     关掉() 此方法不会等待先前提交的任务完成执行。使用awaitTermination()来做到这一点。

也许这就是问题?