背景
今天在写单测的时候,会涉及到测试多线程的部分,但是在测试的时候发现现象会诡异
子线程的逻辑还没有执行的时候,jvm就会退出,或者有的时候执行了一小部分,就会退出了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| try { Table table = hbaseConnection.getTable(TableName.valueOf(TABLE_NAME)); new Thread(() -> { try { while (totalCount.get() < 50) { System.out.printf("开始跑 %s \n", totalCount.get()); putRowsS(table, 1); totalCount.incrementAndGet(); } } catch (Throwable e) { e.printStackTrace(); } }).start(); System.out.println("执行完事"); } catch (Throwable throwable) { throwable.printStackTrace(); }
|
解决思路
第一时间以为是遇到了报错,或者是异常。但是所有的地方都加了try catch还是没有发现有任何的错误
后来在主线程执行的地方,加了日志,发现子线程还没有执行的时候,主线程就已经跑完了,然后就导致jvm直接退出了
后来在网上搜了一下,发现在junit的底层,主线程执行完后,就调用了System.exit来进行退出了,这个时候jvm就会退出,而不会等待子线程的执行。
解决方法