文档章节

Java 单元测试中的多线程无故退出

learn_more
 learn_more
发布于 2015/08/26 10:14
字数 548
阅读 783
收藏 4

问题发现

最近在复习多线程相关知识,结果一动手就出现了问题,问题是这样的,在单元测试中使用多线程测试,发现只要子线程在睡眠一段时间,程序就退出了,毫无征兆!!!!

看看我的代码(请不要拘泥这段代码带来的并发问题):

 public class ThreadTest{
 
    class MyThread implements Runnable{
         
        private int count = 0 ;
         
        public void run(){
            try{
                Thread.sleep(1000); // 子线程休眠一秒,程序都退出
            }catch(InterruptedExcetption e ){
                e.printStackTrace();
            }
            while(count < 15){
                count ++;
                System.out.println(count);
            }
        }
    }
 
 
    @Test
    public void threadtest(){
         
        MyThread m1 = new MyThread();
         
        Thread t1 = new Thread(m1);
        Thread t2 = new Thread(m1);
        Thread t3 = new Thread(m1);
         
        t1.start(); // 子线程
        t2.start(); // 子线程
        t3.start(); // 子线程
        
        System.out.println(Thread.currentThread().getName()); // main 线程
    }


问题分析

最后查资料才发现:

原来这是单元测试的bug,如果把同样的程序放在main中运行是不会出现这个问题的!

具体JUnit源码我不知道,不过事实就是这样:你在单元测试中打印出当前线程的名称确实是main,

然后如果在单元测试中开启了线程,这个线程如果一直处于运行状态的话,那么就算单元测试运行完成,

子线程也不会退出;

但是,如果子线程处于阻塞、消亡状态,那么单元测试会立刻停止所有的子线程,同时退出程序!


问题解决

1)使子线程不处于阻塞状态,那么就算单元测试运行完成,子线程也不会退出;

2)可以强制要求所有子线程运行完成之后,在运行主线程,如下代码:

        t1.start(); // 子线程
        t2.start(); // 子线程
        t3.start(); // 子线程
        
        t3.join(); // 保证所有子线程运行完成之后,才运行下面的代码
        
        System.out.println(Thread.currentThread().getName()); // main 线程

3)不适用单元测试测试多线程,使用main进行测试


© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 91
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
加载中

评论(1)

shiliting
shiliting
据说单元测试设计的就是这样。
8个超实用的Java测试工具和框架

Java入门 如果你才刚开始接触Java世界,那么要做的第一件事情是,安装JDK——Java Development Kit(Java开发工具包),它自带有Java Runtime Environment(JRE)和JVM(Java运行时环境)。它...

拉偶有所依
2015/06/24
0
0
Apache Ant 1.9.4 发布,支持 Java 1.9

Apache Ant 1.9.4 发布,该版本引入对 Java 1.9 的支持,支持多线程运行 JUnit 单元测试,基于 JUnit 4 重构 Ant 自己的单元测试。 Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起...

oschina
2014/05/07
4.5K
10
Java 学习(27)---(多线程 / Runnable 接口 / 调度和优先级)

多线程 1 .概念 多线程:一个应用程序有多条执行路径进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 ...

姜白告
2018/08/03
0
0
JAS 2.5.4821 发布,Java 代数系统

Java Algebra System 2.5.4821 发布,此版本更新内容如下: brings the solvable polynomial common divisor package edu.jas.fd in a partially usable condition The definition of great......

oschina
2014/04/24
1K
2
Java多线程学习(四)等待/通知(wait/notify)机制

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
2018/04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring学习记录

Java类定义配置 @Configuration //标记为配置类@ComponentScan //标记为扫描当前包及子包所有标记为@Component的类@ComponentScan(basePackageClasses = {接口.class,...}) //标记为扫描当...

CHONGCHEN
25分钟前
1
0
如何开发一款以太坊(安卓)钱包系列2 - 导入账号及账号管理

这是如何开发一款以太坊(安卓)钱包系列第2篇,如何导入账号。有时用户可能已经有一个账号,这篇文章接来介绍下,如何实现导入用户已经存在的账号。 导入账号预备知识 从用户需求上来讲,导...

Tiny熊
今天
3
0
intellJ IDEA搭建java+selenium自动化环境(maven,selenium,testng)

1.安装jdk1.8; 2.安装intellJ; 3.安装maven; 3.1 如果是单前用户,配置用户环境变量即可,如果是多用户,则需配置系统环境变量,变量名为MAVEN_HOME,赋值D:\Application\maven,往path中...

不最醉不龟归
今天
4
0
聊聊ShenandoahGC的Brooks Pointers

序 本文主要研究一下ShenandoahGC的Brooks Pointers Shenandoah Shenandoah面向low-pause-time的垃圾收集器,它的GC cycle主要有 Snapshot-at-the-beginning concurrent mark包括Init Mark(P......

go4it
昨天
4
0
Makefile通用编写规则

#简单实用的Makefile模板: objs := a.o b.o test:$(objs) gcc -o test $^ # .a.o.d .b.o.d dep_files := $(foreach f,$(objs),.$(f).d) dep_files := $(wildcard $(dep_files)) ifneq ($(d......

shzwork
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部