我正在用 Java 编写一个多人网络游戏,玩家连接到服务器并获得可以玩的“卡”,每个玩家都有一个在自己的线程中生成的服务来处理所有事情。 我想做的是找到一种方法让服务器“暂停”,直到所有玩家都连接并到达服务中的同一点,以便游戏可以开始。
服务器产生如下线程:
for (int i = 1; i <= numPlayers; i++){
ArrayList<Card> playersCards = getPlayersCards(i-1);
Socket s = server.accept();
System.out.println("Player "+ i +" connected.");
Service service = new Service(s, playersCards);
Thread t = new Thread(service);
t.start();
}
然后是我的服务:
public class Service implements Runnable {
private Socket s;
private Scanner in;
private PrintWriter out;
private ArrayList<Card> cards;
public Service(Socket aSocket, ArrayList<Card> cards) {
s = aSocket;
this.cards = cards;
}
public void run() {
try {
in = new Scanner(s.getInputStream());
out = new PrintWriter(s.getOutputStream());
out.println("Welcome to the Simple Stock Market Game.");
out.flush();
sendCards();
//AT THIS POINT THE SERVICE WOULD NEED TO wait for all players to connect
} catch (IOException e) {
e.printStackTrace();
} finally {
out.println("Thanks for playing the Simple Stock Market Game.");
out.flush();
}
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Player disconnected.");
}
private void sendCards() {
Gson gson = new Gson();
String cardsJSON = gson.toJson(cards);
out.println(cardsJSON);
out.flush();
}
}
现在我假设我可以向服务传递将有多少玩家,并等待那么多线程到达该点? 不太确定,希望大家帮忙!
最佳答案
您可以使用java.util.concurrent.CountDownLatch ,这正是您所需要的。
在创建服务的循环之前,使用预期的线程(玩家)数量对其进行初始化:
CountDownLatch playersLatch = new CountDownLatch(numPlayers);
然后投入使用:
playersLatch.countDown();
try {
playersLatch.await();
} catch (InterruptedException ex) {
//handle interruption
}
您可能还想看看 java.util.concurrent.CyclicBarrier ,与此类似,但允许在释放等待线程后重用。
关于java - 等待具有相同服务的其他线程达到某个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20275095/