首页 > 解决方案 > ExecutorService.execute() 静默退出 run() 方法

问题描述

试图测试我的一个类是否可以处理在多个线程上被访问。我有一个 JUnit 测试,我在其中创建了一个类来实现Runnable和运行我的类。

当我运行执行时,它到达 run() 方法中的一行,然后在该线程上退出而没有报告任何问题,我用 Try-Catch(Throwable) 包装了它,但仍然没有迹象表明出了什么问题。

这是我的代码:

class ConcurrencyTests {
    class ConcurrentComponentTracker implements Runnable {
        private String component;

        ConcurrentComponentTracker(String component) {
            this.component = component;
       }

       @Override
       public void run() {
           try {
           System.out.printf("Component to track: [%s]\n", component);
           ParserHandler parserHandler = new ParserHandler();
           System.out.println(parserHandler.componentTracker(component));
           }
           catch (Throwable t) {
               t.printStackTrace();
           }
       }
   }

    @Test
    void runRunner() {
        ExecutorService executor = Executors.newFixedThreadPool(4);
        String[] componentsToTrack = {"x", "y", "z"};

        executor.execute(new ConcurrentComponentTracker(componentsToTrack[0]));
        executor.execute(new ConcurrentComponentTracker(componentsToTrack[1]));
        executor.execute(new ConcurrentComponentTracker(componentsToTrack[2]));
    }
}

和输出:

Component to track: [x]

Component to track: [y]

Component to track: [z]

它似乎只是在 ParserHandler 实例化行上退出而没有报告任何内容。当尝试调试并进入该行时,它只是跳到最后,而不让我检查 ParserHandler 类实例化。

标签: javamultithreadingjunitexecutorservice

解决方案


谁在评论中回答然后删除它为我解决了这个问题。我的主 JUnit 线程没有等待其他线程完成。所以我将这些行添加到最后,它按预期工作:

executor.shutdown();

try {
    executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
}
catch (InterruptedException e) {
    e.printStackTrace();
}

推荐阅读