美文网首页
Junit与多线程

Junit与多线程

作者: 过来摸摸头丶 | 来源:发表于2018-10-17 15:56 被阅读0次

背景:编写Junit测试多线程,线程类的run方法中做了网络请求。

问题:在运行Junit后,jvm自动停止了。debug运行,也没有到线程类的run方法里面。

原因:让我们来看TestRunner类中的main方法

TestRunner 类
public static void main(String args[]) {
        TestRunner aTestRunner = new TestRunner();
        try {
            TestResult r = aTestRunner.start(args);
            if (!r.wasSuccessful()) {
                System.exit(FAILURE_EXIT);
            }
            System.exit(SUCCESS_EXIT);
        } catch (Exception e) {
            System.err.println(e.getMessage());
            System.exit(EXCEPTION_EXIT);
        }
    }

Test Result 类
public synchronized boolean wasSuccessful() {
        return failureCount() == 0 && errorCount() == 0;
    }

由以上可知,在执行完主线程后直接判断TestResult类的wasSuccessful()方法,如果返回false,则关闭jvm。

之后做了小的测试,代码如下:

public class JunitAndThread {

    @Test
    public void testJunitAndThread(){
        for (int i = 0; i < 5; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("当前线程id:" + Thread.currentThread().getId());
                }
            }).start();
        }
    }

}

以上的输出:

当前线程id:11
当前线程id:12
当前线程id:13
当前线程id:14
当前线程id:15

嗯?这不是运行完毕了?那…会不会是之前没运行完毕,是因为线程中的方法没有执行完?验证一下:

把上面的测试类修改:
public class JunitAndThread {

    @Test
    public void testJunitAndThread(){
        for (int i = 0; i < 5; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 1000000000; i++) {

                    }
                    System.out.println("当前线程id:" + Thread.currentThread().getId());
                }
            }).start();
        }
    }

}

输出结果:

Process finished with exit code 0

嗯,果然是这样。

解决办法1:既然是子线程没执行完,我们可以让主线程等等子线程

public class JunitAndThread {

    @Test
    public void testJunitAndThread(){
        for (int i = 0; i < 5; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 1000000000; i++) {

                    }
                    System.out.println("当前线程id:" + Thread.currentThread().getId());
                }
            }).start();
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

输出结果:

当前线程id:14
当前线程id:12
当前线程id:15
当前线程id:13
当前线程id:11

Process finished with exit code 0

解决办法2:使用CountDownLatch(统计计数器)

没执行完一条线程后,计数器就会减1,主线程会调用await()方法会进入等待状态,当计数器减为0的时候执行
public class JunitAndCountDownLatch {

    private CountDownLatch countDownLatch = new CountDownLatch(5);

    @Test
    public void testCountDownLatch(){

        for (int i = 0; i < 5; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(
                            "当前线程: " +
                            Thread.currentThread().getId() +
                            ", 当前线程名称: " +
                            Thread.currentThread().getName()
                    );
                    countDownLatch.countDown();
                }
            },"统计计数器————多线程测试").start();
        }

        try {
            countDownLatch.await(); //主线程等待
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}

总结:Junit测试多线程中,主线程不会等待子线程全部执行完然后exit。

相关文章

  • Junit与多线程

    背景:编写Junit测试多线程,线程类的run方法中做了网络请求。 问题:在运行Junit后,jvm自动停止了。d...

  • 单元测试-多线程测试

    实际上Junit是不支持多线程测试的。。。 全文完。 等等!还有办法!! 为什么Junit不支持多线程测试?因为J...

  • JUnit4 测试多线程

    JUnit4 实际上不支持测试多线程程序。 The article at http://www.planetgee...

  • ①TestNG 与 JUnit 测试框架

    一、TestNG与JUnit的不同点: JUnit 1、JUnit只能进行单元测试2、JUnit只能使用IDE运行...

  • junit 测试TCP Client 链接时崩溃

    问题:其实是Junit 测试多线程问题 普通的注解方式,当测试的内容含有多线程时,测试代码段运行结束后,其他非主动...

  • 【JUnit】使用JUnit 进行多线程测试无法完成测试

    使用JUnit 进行多线程测试并发情况,但因单元测试主线程结束,其他多线程进行也会被销毁停止执行,无法完成单元测试...

  • Junit5测试框架

    Junit5测试框架 一、Junit5框架构成 与以前的 JUnit 版本不同,JUnit 5 由来自三个不同子项...

  • junit多线程测试异常

    问题起因 有一次要测试下多线程删除redis数据,会不会有问题,比如边界条件没控制好啥的,导致多删数据了,我就想着...

  • Spring与Junit4整合

    Spring与Junit4整合

  • JUnit 5 教程 之 基础篇

    JUnit 5 作为新一代的 Java 单元测试框架,提供很多改进。例如对比 JUnit4 与 JUnit5 的官...

网友评论

      本文标题:Junit与多线程

      本文链接:https://www.haomeiwen.com/subject/cykmaftx.html