召唤神龙

这应该是gitchat上面一个列子,讲到多线程并发控制。找不到出处了。如有侵权什么的 请联系我立马删除,个人觉得很形象生动通俗易懂,值得分享。

 
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;

public class SummonDragonDemo {

    private static final int THREAD_COUNT_NUM = 7;
    private static CountDownLatch countDownLatch = new CountDownLatch(THREAD_COUNT_NUM);

 

    public static void main(String[] args) {

        //设置第一个屏障点,等待召集齐7位法师
        CyclicBarrier callMasterBarrier = new CyclicBarrier(THREAD_COUNT_NUM, ()-> {
                System.out.println("7个法师召集完毕,同时出发,去往不同地方寻找龙珠!");
                summonDragon();
        });
        //召集齐7位法师
        for (int i = 1; i <= THREAD_COUNT_NUM; i++) {
            int index = i;
            new Thread(() -> {
                try {
                    System.out.println("召集第" + index + "个法师");
                    callMasterBarrier.await();
                } catch ( Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }

    /**
    * 召唤神龙:1、收集龙珠;2、召唤神龙
    */
    private static void summonDragon() {
        //设置第二个屏障点,等待7位法师收集完7颗龙珠,召唤神龙
        CyclicBarrier summonDragonBarrier = new CyclicBarrier(THREAD_COUNT_NUM, new Runnable() {
            @Override
            public void run() {
                System.out.println("集齐七颗龙珠!召唤神龙!");
            }
        });
        //收集7颗龙珠
        for (int i = 1; i <= THREAD_COUNT_NUM; i++) {
            int index = i;
            new Thread(() -> {
                try {
                    System.out.println("第" + index + "颗龙珠已收集到!");
                    summonDragonBarrier.await();
                } catch ( Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
 
    public static void zh() throws InterruptedException {
    	for (int i = 1; i <= THREAD_COUNT_NUM; i++) {
            int index = i;
            new Thread(() -> { 
                try {
                    System.out.println("第" + index + "颗龙珠已收集到!");
                    //模拟收集第i个龙珠,随机模拟不同的寻找时间
                    Thread.sleep(new Random().nextInt(3000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //每收集到一颗龙珠,需要等待的颗数减1
                countDownLatch.countDown();
            }).start();
        }
        //等待检查,即上述7个线程执行完毕之后,执行await后边的代码
        countDownLatch.await();
        System.out.println("集齐七颗龙珠!召唤神龙!");
    }
    
}


召集第2个法师
召集第6个法师
召集第5个法师
召集第4个法师
召集第1个法师
召集第7个法师
召集第3个法师
7个法师召集完毕,同时出发,去往不同地方寻找龙珠!
第1颗龙珠已收集到!
第2颗龙珠已收集到!
第3颗龙珠已收集到!
第4颗龙珠已收集到!
第5颗龙珠已收集到!
第6颗龙珠已收集到!
第7颗龙珠已收集到!
集齐七颗龙珠!召唤神龙!


CyclicBarrier 和 CountDownLatch 的区别
CountDownLatch 的计数器只能使用一次。而 CyclicBarrier 的计数器可以使用 reset() 方法重置。所以 CyclicBarrier 能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。
CyclicBarrier 还提供其他有用的方法,比如 getNumberWaiting 方法可以获得 CyclicBarrier 阻塞的线程数量。isBroken 方法用来知道阻塞的线程是否被中断。比如以下代码执行完之后会返回 true。
CountDownLatch 会阻塞主线程,CyclicBarrier 不会阻塞主线程,只会阻塞子线程。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 召唤神龙是一款经典的小游戏,可以使用JavaScript来实现。以下是一种简单的实现方式。 首先,我们需要在HTML文件中创建一个画布(canvas)用来显示游戏界面。这可以通过在body元素中添加一个canvas标签来实现。 ```html <canvas id="gameCanvas" width="800" height="600"></canvas> ``` 接下来,在JavaScript文件中,我们需要获取这个canvas元素并保存到一个变量中。 ```javascript var canvas = document.getElementById("gameCanvas"); var ctx = canvas.getContext("2d"); ``` 然后,我们可以定义一些游戏所需的变量,比如神龙的位置、大小、速度等。 ```javascript var dragonX = canvas.width / 2; var dragonY = canvas.height - 100; var dragonSize = 80; var dragonSpeed = 5; ``` 接着,我们需要编写一些函数来处理游戏的逻辑。比如,我们可以编写一个函数来绘制神龙。 ```javascript function drawDragon() { ctx.beginPath(); ctx.arc(dragonX, dragonY, dragonSize, 0, Math.PI * 2); ctx.fillStyle = "green"; ctx.fill(); ctx.closePath(); } ``` 还可以编写一个函数来更新神龙的位置。 ```javascript function updateDragon() { if (ArrowLeft键按下) { dragonX -= dragonSpeed; } if (ArrowRight键按下) { dragonX += dragonSpeed; } if (ArrowUp键按下) { dragonY -= dragonSpeed; } if (ArrowDown键按下) { dragonY += dragonSpeed; } } ``` 最后,在主循环中调用这些函数。 ```javascript function main() { ctx.clearRect(0, 0, canvas.width, canvas.height); drawDragon(); updateDragon(); requestAnimationFrame(main); } main(); ``` 这只是一个简单的召唤神龙小游戏的实现方式。你可以根据自己的需求添加更多的功能,比如添加障碍物、得分系统等。 ### 回答2: 召唤神龙小游戏是一款基于JavaScript开发的互动游戏,它依据热门日本动画《龙珠》中的情节设计而成。以下是一个使用JavaScript实现召唤神龙小游戏的简单示例: ```javascript <!DOCTYPE html> <html> <body> <button onclick="summonDragon()">召唤神龙</button> <script> function summonDragon() { var randomNum = Math.floor(Math.random() * 7) + 1; // 生成一个1-7之间的随机数 var dragon = ""; switch(randomNum) { case 1: dragon = "神龙:满足你一个愿望"; break; case 2: dragon = "神龙:给你1000年寿命"; break; case 3: dragon = "神龙:让你变成超级赛亚人"; break; case 4: dragon = "神龙:帮你找到七龙珠"; break; case 5: dragon = "神龙:让你获得无限力量"; break; case 6: dragon = "神龙:解散你的死党"; break; case 7: dragon = "神龙:让你在下次召唤时无法实现愿望"; break; default: dragon = "神龙:满足你一个愿望"; break; } alert(dragon); } </script> </body> </html> ``` 在这个小游戏中,当用户点击"召唤神龙"按钮时,利用JavaScript的Math.random()函数生成一个1到7之间的随机数,并用switch语句根据不同的随机数生成不同的神龙愿望。最后,通过alert()弹窗将神龙的愿望展示给用户。用户每次点击按钮,都会获得不同的神龙愿望,增加了游戏的趣味性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值