java多线程开发之通过对战游戏学习CyclicBarrier

java多线程开发之通过对战游戏学习CyclicBarrier:

构造方法:
CyclicBarrier(int parties):
创建一个新的 CyclicBarrier,当给定数量的线程(线程)等待他时候,他将跳闸
并且当屏障跳闸时候不执行预定的动作.
CyclicBarrier(int parties,Runnable barrierAction):
创建一个新的 CyclicBarrier ,当给定数量的线程(线程)等待时,它将跳闸,当屏障跳闸时执行给定的屏障动作,由最后一个进入屏障的线程执行。

接口方法:

需求:

继上一篇CountDownLatch模拟游戏加载后,现在用户点击开始按钮后,需要匹配包括自己在内的五个玩家才能开始游戏,匹配玩家成功后进入到选择角色阶段。当5位玩家角色都选择完毕后,开始进入游戏。进入游戏时需要加载相关的数据,待全部玩家都加载完毕后正式开始游戏。

解决方案

从需求中可以知道,想要开始游戏需要经过三个阶段,分别是

匹配玩家

选择角色

加载数据

在这三个阶段中,都需要互相等待对方完成才能继续进入下个阶段。

这时可以采用CyclicBarrier来作为各个阶段的节点,等待其他玩家到达,在进入下个阶段。

 

 代码演示:

  1 package com.heima.duotai1;
  2 import java.io.IOException;
  3 import java.util.concurrent.CyclicBarrier;
  4 import java.util.concurrent.locks.Lock;
  5 import java.util.concurrent.locks.ReentrantLock;
  6 
  7 public class StartGame implements Runnable {
  8     int ticket=0;
  9     Object obj=new Object();
 10     private String player;//定义玩家
 11     private CyclicBarrier barrier;//barrier障碍物
 12 
 13     //空参数构造方法
 14     public StartGame() {
 15     }
 16 
 17     //满参数构造方法
 18     public StartGame(String player, CyclicBarrier barrier) {
 19         this.player = player;
 20         this.barrier = barrier;
 21     }
 22 
 23     public String getPlayer() {
 24         return player;
 25     }
 26 
 27     public void setPlayer(String player) {
 28         this.player = player;
 29     }
 30 
 31     public CyclicBarrier getBarrier() {
 32         return barrier;
 33     }
 34 
 35     public void setBarrier(CyclicBarrier barrier) {
 36         this.barrier = barrier;
 37     }
 38 
 39     @Override
 40     public void run() {
 41         //设置窗口
 42 
 43         while (true)
 44         if (ticket>=0) {
 45                 try {
 46 
 47                     System.out.println(this.getPlayer() + "开始匹配玩家。。。");
 48                     barrier.await();
 49                     Thread.sleep(100);
 50                     findOtherPlayer();
 51                     System.out.println(this.getPlayer() + "进行选择游戏角色。。。");
 52                     barrier.await();
 53                     Thread.sleep(100);
 54                     choiceRole();
 55                     System.out.println(this.getPlayer() + "开始进行游戏加载。。。");
 56                     Thread.sleep(100);
 57                     loading();
 58                     System.out.println(this.getPlayer() + "游戏加载完毕等待其他玩家加载完成。。。");
 59                     barrier.await();
 60                     StartGame b = new StartGame();
 61                     Thread a = new Thread(b);
 62                     a.start();
 63                 } catch (Exception e) {
 64                     e.printStackTrace();
 65                 }
 66 
 67         }
 68     }
 69     private void loading() {
 70 
 71     }
 72 
 73     private void choiceRole() {
 74 
 75     }
 76 
 77     private void findOtherPlayer() {
 78 
 79     }
 80 
 81     public static void main(String[] args) throws IOException {
 82         CyclicBarrier barrier=new CyclicBarrier(5,()->{
 83             try {
 84                 System.out.println("阶段完成,等待2秒");
 85                 Thread.sleep(2000);
 86                 System.out.println("进入下个阶段");
 87             } catch (InterruptedException e) {
 88                 e.printStackTrace();
 89             }
 90         });
 91         Thread thread = new Thread(new StartGame("张无忌", barrier));
 92         Thread thread1 = new Thread(new StartGame("张三丰", barrier));
 93         Thread thread2 = new Thread(new StartGame("皱滋润", barrier));
 94         Thread thread3 = new Thread(new StartGame("周子若", barrier));
 95         Thread thread4 = new Thread(new StartGame("赵敏", barrier));
 96         thread.start();
 97         thread1.start();
 98         thread2.start();
 99         thread3.start();
100         thread4.start();
101         System.in.read();
102     }
103 }

 

posted on 2019-04-01 14:57  风一般的男子·小亮  阅读(332)  评论(0编辑  收藏  举报

导航