Java 单元测试中的多线程无故退出
来源:互联网 发布:正版mac ps软件多少钱 编辑:程序博客网 时间:2024/05/29 15:27
原文:https://my.oschina.net/heweipo/blog/497176
问题发现
最近在复习多线程相关知识,结果一动手就出现了问题,问题是这样的,在单元测试中使用多线程测试,发现只要子线程在睡眠一段时间,程序就退出了,毫无征兆!!!!
看看我的代码(请不要拘泥这段代码带来的并发问题):
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进行测试
--------------------------------------
下面描述一下我遇到的问题:因为要测试亿万级别数据库的删除和抗压能力,所以要造数据,在一个测试方法里面起了多了线程,但是发现线程其实是开始执行了的,数据也有插入,就是执行屁大一会儿就之行结束了,各种找不到原因之后才发现是这个原因。
在测试代码里面,主线程死了之后,其它线程也会跟着死掉。
阅读全文
0 0
- Java 单元测试中的多线程无故退出
- curl 多线程在android下无故退出的问题
- Java中的Mongodb单元测试
- 修正主程序无故退出的BUG
- linux下qq无故退出的问题
- 多线程中的确保子线程退出之后 主线程退出
- java linux 项目经常无故被关闭 进程无故消息
- 多线程单元测试
- [java多线程]如何安全的退出线程
- 多线程退出
- U盘中的文件无故丢失怎么办
- 关于Java单元测试中的伪对象介绍
- java反射在单元测试中的应用
- Java 程序中的多线程
- Java 程序中的多线程
- Java 程序中的多线程
- Java程序中的多线程
- java中的多线程
- PHP的password_hash()使用实例
- Spark1.4.0-SparkSQL与Hive整合-支持窗口分析函数
- QPROPERTY
- jsday05(js回顾 dom回顾)
- exe触发断点
- Java 单元测试中的多线程无故退出
- 数学之美------“文字与数学”的冷知识
- vue引入bootstrap——webpack
- Spring @Profile标签使用:
- GBK转UTF-8时,奇数个中文会乱码,偶数个中文不会乱码
- lambda函数在Tkinter中的一个应用
- @TransactionConfiguration过时与替代写法
- java多线程知识补充
- MySQL内核技术之“SQL语法修改”