前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Junit 多线测试 问题

Junit 多线测试 问题

作者头像
java404
发布2018-05-18 14:35:53
1.4K0
发布2018-05-18 14:35:53
举报
文章被收录于专栏:java 成神之路java 成神之路

问题

在使用Junit测试时,发现在测试方法中启动新的线程,结果新开启的线程未执行,测试方法就结束了。难道Junit不支持多线程测试?

示例如下:

代码语言:javascript
复制
public class ThreadTest {
    @Test
    public void testSleep() {
        Thread t = new Thread(()-> {
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
            }
            System.out.println("--------");
        });
        
        t.start();

        System.out.println("end...");
    }
}

第一想法就是 在junit中启动的线程都是daemon的?线程调用start() 方法后是不能修改线程的daemon状态的。 还可能一种可能就是,执行完主线程后就直接System.exit() 退出jvm。

下面我们分析下源码,看看到底是什么情况

Debug模式下运行 testSleep() 方法,如下:

通过 Junit 运行 testSleep() 方法,我们发现Junit的运行启动主类:

代码语言:javascript
复制
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.java

执行的方法 RemoteTestRunner.main(String arg[])

RemoteTestRunner.main() 源码分析

代码语言:javascript
复制
public static void main(String  JavaDoc[] args) {
    try {
        RemoteTestRunner testRunServer= new RemoteTestRunner();
        testRunServer.init(args);
        testRunServer.run();
    } catch (Throwable  JavaDoc e) {
        e.printStackTrace(); // don't allow System.exit(0) to swallow exceptions
    } finally {
        // fix for 14434
        System.exit(0);
    }
}

从代码中我们发现,当执行完testSleep()方法的主线程时,就会调用 finally里面的 System.exit(0) 方法,让JVM强制退出。这是在testSleep()方法中启动的新线程也就强制停止了,而不会打印线程中输出的信息。

解决办法

最简单的解决办法如下:

代码语言:javascript
复制
@Test
public void testSleep() throws InterruptedException {
    Thread t = new Thread(()-> {
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
        }
        System.out.println("--------");
    });
        
    t.start();
    
    System.out.println("end...");
    
    t.join();
//  TimeUnit.SECONDS.sleep(1000);
    }

也可以使用 FutrueTask、CountDownLatch等。


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.10.18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 示例如下:
    • 下面我们分析下源码,看看到底是什么情况
    • RemoteTestRunner.main() 源码分析
    • 解决办法
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档