繁体   English   中英

执行器服务。 如何等待所有线程终止

[英]executor service. how to await while all threads will terminate

请帮助了解并发问题。

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

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结果。

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

在哪里搜索错误? 在此代码或更深的地方?

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

在此处输入图片说明

更新:

如果这样重写代码:

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

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

更新

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

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

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

-> shutdown()此方法不等待先前提交的任务完成执行。 使用awaitTermination()可以做到这一点。

也许这是问题所在?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM