在做mybatis的多个线程修改内容时候的遇到的问题;
主线程执行完毕之后,子线程全部自动被杀死!!!
验证测试:
@Test
public void multiTheadUpdate() {
for(int i=0;i<10000;i++){
int finalI = i;
new Thread(()->{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(finalI);
}).start();
}
System.out.println("主线程结束");
}
运行结果:
8549
8546
8543
8542
8541
8540
8539
9126
主线程结束
很多9000都没有被输出,说明主线程一停,所有线程都停掉了,即使t.setDaemon(false)也不行;
当测试主线程执行结束后,不管子线程是否结束,都会回调TestResult的wasSuccessful方法,
然后判断结果是成功还是失败,最后调用相应的System.exit()方法。大家都知道这个方法是用来结束当前正在运行中的java虚拟机,jvm都自身难保了,所以子线程也就对不住你咧...
解决方案1:可能不太好,但是也是解决燃眉之急,在src下自己建立测试类测试;
解决方案2:使用countDownLatch,当子线程执行完毕之后,再关闭主线程java多线程
public class Main {
public static void main(String[] args) throws InterruptedException {
int num = 10000;
//创建CountDownLatch对象
CountDownLatch countDownLatch = new CountDownLatch(num);
for (int i = 0; i < num; i++) {
new Thread(() -> {
System.out.println("子线程");
countDownLatch.countDown();//每次运行完子线程任务就-1
}).start();
}
countDownLatch.await();//当所有的子线程都运行完毕,就继续执行主线程
System.out.println("等待完毕,主线程执行!");
}
}