如何在java中使用多线程,以便在游戏中轮流使用

ct3nt3jp  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(272)

尝试使用n个线程,其中有两种不同类型的线程需要交换。t1、x1、t2、x2、t3、x3也是如此。。。。其中x和t是线程类。我一直在尝试使用等待和通知,但似乎无法让这个工作。或同步。
所有线程都需要在各自的“轮次”中访问和修改相同的列表数组,我认为这可能是它自己的同步类,但也许一个原子变量也可以工作?
非常感谢您的帮助。
"""

public String startGame(int threadNumbers, List<String> result, String fileLoc) throws IOException {
        Players[] playerThreads = new Players[threadNumbers];
        Card[] cardThreads = new Card[threadNumbers];
        cardDeck cardD = new cardDeck(fileLoc);

        for (int i = 0; i < (threadNumbers); i++) {
                System.out.println(i);
                playerThreads[i] = new Players(i+1, cardD);
                if (i>0) {
                    playerThreads[i-1].next = cardThreads[i-0];
                }
                if (i==threadNumbers-1) {
                    playerThreads[i].next = cardThreads[0];
                }
                cardThreads[i] = new Card(i+1);
                if (i>0) {
                    cardThreads[i-1].next = playerThreads[i-0];
                }
                if (i==threadNumbers-1) {
                    cardThreads[i].next = playerThreads[0];
                }

            new Thread(playerThreads[i]).start();
            new Thread(cardThreads[i]).start();
            Thread.yield();
            Thread.yield();
        }
        synchronized (playerThreads[0]) {
            playerThreads[0].notify();

"""
这是不起作用,但需要发生的是,他们采取了一个循环的方式从甲板卡,然后开始游戏后,他们有一手。卡线也只是手,但不同,因为他们不“玩”,但只是工作。

13z8s7eq

13z8s7eq1#

因为这似乎是一个多线程(jvm)进程,所以这里不需要多线程:只需使用一个队列来跟踪轮到谁和下一个轮到谁。轮到玩家后,将其添加回队列末尾。
实际上,现在我想起来了,没有理由同一个解决方案不能处理多个进程或套接字。
只需要排队
--编辑--
所以您需要的是一个带有阻塞方法的类。例如

public class Player implements Runnable {
  private Move nextMove;

  public Move synchronized getMove() {
    if (!nextMove) {
      this.wait([add timeout if appropriate]);
    }
    Move next = nextMove;
    nextMove = null;
    return next;
  }

  public void run() {
    while (true) {
      Thread.sleep([someRandomTime]);
      synchronized(this) {
        if (nextMove == null) {
          nextMove = new Move();
          this.notify();
        }
      }
    }
  }
}

所以仍然使用您的队列,您遍历每个玩家并调用getmove(),它将阻止,直到玩家发布移动。
顺便说一句,这种阻塞类似于inputstream.read(缓冲区)在套接字中的工作方式。调用read的线程等待流的另一端发送一些内容。
--编辑2--
作为提醒:不要在线程对象上使用synchronized、wait、notify或notifyall。

相关问题