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



尝试使用n个线程,其中有两种不同类型的线程需要在它们之间交换。t1,x1,t2,x2,t3,x3也是如此,其中x和t是线程类。我一直在尝试使用"等待并通知",但似乎无法实现。或同步。

所有线程都需要访问和修改它们各自的"中的相同列表数组;"转弯";我认为它可能是自己的同步类,但也许原子变量也可以工作?

非常感谢您的帮助。

"quot">

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();

"quot">

这不起作用,但需要做的是,他们以循环的方式从牌组中取出一张牌,然后在拿到牌后开始比赛。卡线也只是手,但不同之处在于它们不是"手";播放";但只是工作。

由于这似乎是在一个(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-

提醒一下:不要在Thread对象上使用synchronized、wait、notify或notifyAll。

相关内容

  • 没有找到相关文章

最新更新