多线程并发,子线程不执行问题(模拟并发抽奖)

本文通过实例演示了解决在JUnit环境下并发子线程不运行的问题。作者最初在模拟并发抽奖的场景时,发现子线程有时无法正常执行。经过研究发现,这是因为JUnit会在父线程结束后终止所有子线程。通过将测试方法改为main方法,成功解决了该问题。

今天在做模拟并发抽奖的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);

修改代码后运行结果:


搞定。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值