java - ExecutorService.execute() 静默退出 run() 方法

标签 java multithreading junit executorservice

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

当我运行execute时,它到达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]));
    }
}

输出:

要跟踪的组件:[x]

要跟踪的组件:[y]

要跟踪的组件:[z]

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

最佳答案

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

executor.shutdown();

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

关于java - ExecutorService.execute() 静默退出 run() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53722946/

相关文章:

java - 从内部类引用

java - 使用 jquery ajax 调用托管 bean 方法并在 jquery 中取回结果

java - 容纳给定人员所需的最少汽车

Java 锁类型,如果另一个线程正在执行则取消执行

java - JUnit - Android Studio - NoClassDefFoundError 异常

java - 如何在 JUnit 测试中验证复杂的 JSONObjects?

java - clj-ssh/JSch 无法在 Windows 上加载库 'c'

c++ - 通过线程本地存储访问 shared_ptr

java线程和操作系统线程

Java测试异常