【问题标题】:executor service. how to await while all threads will terminate执行人服务。所有线程都将终止时如何等待
【发布时间】: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


【解决方案1】:

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

在多线程环境中该行为可能出乎意料。

【讨论】:

    【解决方案2】:

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

    也许这就是问题所在?

    【讨论】:

    • 在这种情况下,我的应用程序挂起
    猜你喜欢
    • 2020-02-15
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多