java - 等待具有相同服务的其他线程达到某个点

标签 java multithreading

我正在用 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/

相关文章:

java - 如何在 Maven 生成的 jar 中包含特定文件夹?

c++ - Qt 进程事件

java - Java中如何从文本文件中读取字符串?

java - Android:在 Switch 语句中嵌套 for 循环以获取 ArrayList 的总和

java - 使用 JTable.setRowHeight 更改行高不起作用

java - 生产者消费者——使用Executors.newFixedThreadPool

java - 使用了Java CompletableFuture线程池

java - 不能使用 AuthenticationException 的子类

c++ - 从 C++ 到 Pro *C 的控制转换期间的段错误

android - 如何在 Android 后台运行 Qt 应用程序?