工作需要对mybatis进行一些单元的并发测试
实现过程中碰到了两个问题:
是如何控制并发线程同时释放。
这里用到了CountDownLatch闭锁,在创建闭锁CountDownLatch工具类对象的时候,初始值设置为与子线程数目相同,在每个子线程里调用了的countDown()方法,让计数器的值就-1,再调用await方法,让线程等待。当计数器的值为0的时候,然后在闭锁上等待的线程就可以恢复工作了。
让主线程在子线程执行后才执行。
这里用到了Thread的join()方法,创建Thread对象并start启动之后维护好所有子线程的Thread对象,在主线程中循环调用所有子线程这个Thread对象的join方法,等待所有子线程执行完成。
实现代码
public void ssmTest4() throws InterruptedException {
Vector<Thread> threads = new Vector<>();
int NUM = 10000;
CountDownLatch cdl = new CountDownLatch(NUM);
Random random = new Random();
for (int i = 0; i < NUM; i++) {
Thread t = new Thread(()->{
try {
// 减一
cdl.countDown();
// 等待
cdl.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 并发执行(这里写业务。)
Long n = Long.valueOf(random.nextInt(100000));
User user = userMapper.findById(n);
System.out.println(user);
System.out.println("并发执行。");
});
threads.add(t);
t.start();
}
for (Thread thread : threads) {
thread.join();
}
}