游戏组队匹配线程类 主要用到是CyclicBarrier类
package com.api.websocket.game;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CyclicBarrier;
import java.util.stream.Collectors;
/**
* 游戏组队匹配线程类
*
* 实际项目远远比这个复杂
* 中通过请求接口,第一个玩家创建房间ID
* 匹配成功后,socket推送结果,还应该考虑匹配超时处理
* @author zhanqi
* @since 2020-11-30 22:30:34
*/
public class PlayerIn implements Runnable {
final int id;
final CyclicBarrier barrier;
final String roomId;
final CopyOnWriteArrayList<Integer> list;
public PlayerIn(final int id, final CyclicBarrier barrier,String roomId,CopyOnWriteArrayList<Integer> list) {
this.id = id;
this.barrier = barrier;
this.roomId=roomId;
this.list=list;
}
@Override
public void run() {
try {
System.out.println("玩家"+this.id + "进入");
System.out.println("系统匹配中......");
Thread.sleep((long) (Math.random() * 10000));
List<Integer> result = list.stream().filter(s -> s != id).collect(Collectors.toList());
System.out.println("玩家"+this.id +"在房间"+roomId+ "匹配到玩家"+result);
this.barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
运行类
package com.api.websocket.game;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CyclicBarrier;
/**
*
* @author zhanqi
* @since 2020-11-30 22:10:10
*/
public class GameMatchingMain {
public static void main(String[] args) {
CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
//3人开始游戏
final int count = 3;
//房间ID
final String roomId=UUID.randomUUID().toString();
final CyclicBarrier barrier = new CyclicBarrier(count, () ->
System.out.println("房间ID:"+roomId+"匹配成功"+list));
for (int i = 0; i < 3; i++) {
list.add(i);
new Thread(new PlayerIn(i, barrier,roomId,list)).start();
}
}
}
结果