今天在做模拟并发抽奖的demo,遇到并发子线程不运行的问题。
运行以下代码,控制台输出“抽奖开始...”,后面有时候会输出子线程中的语句“玩家:xxx 兑奖码:xxx”,有时候不输出,我就纳闷了!
代码如下:
@Test
public void test01(){
//锁住所有线程,等待并发执行
final CountDownLatch begin = new CountDownLatch(1);
//设置最大的并发数量为100
final ExecutorService exec = Executors.newFixedThreadPool(100);
int i = 1;
while (i++ <= 100) {
Runnable run = new Runnable(){
public void run() {
try {
begin.await();//加锁等待,所有线程一起执行
String name = UUID.randomUUID().toString();//随机玩家name
// name = Thread.currentThread().getName();
Player player = new Player(name);//玩家进入游戏
String code = codeService.selRandCode();//随机兑奖码
int playerId = player.getId();
System.out.println("玩家:" + playerId + " " + " 兑奖码: " + code);
choujiang(player.getId(), code);//抽奖操作
} catch (Exception e) {
e.printStackTrace();
}
}
};
exec.submit(run);
}
System.out.println("抽奖开始...");
//所有线程初始化完成后,解锁,让所有线程运行,来模拟多线程并发访问
begin.countDown();
exec.shutdown();//(通知子线程关闭)关闭线程池
}
结果如下:
或者
经过各种百度,发现,使用JUnit Test运行代码的话,父线程结束后,子线程都会被杀死(不管是否运行完)
修改代码如下:
将方法开头
@Test
public void test01(){
//锁住所有线程,等待并发执行
final CountDownLatch begin = new CountDownLatch(1);
改成
public static void main(String[] args){
//锁住所有线程,等待并发执行
final CountDownLatch begin = new CountDownLatch(1);
修改代码后运行结果:
搞定。