Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 遗嘱执行人服务。如何在所有线程终止时等待_Java_Multithreading_Concurrency_Threadpool_Threadpoolexecutor - Fatal编程技术网

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。谢谢现在我知道这个代码是正确的。在这种情况下,我的应用程序是挂起的