尝试使用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();
"""
这是不起作用,但需要发生的是,他们采取了一个循环的方式从甲板卡,然后开始游戏后,他们有一手。卡线也只是手,但不同,因为他们不“玩”,但只是工作。
1条答案
按热度按时间13z8s7eq1#
因为这似乎是一个多线程(jvm)进程,所以这里不需要多线程:只需使用一个队列来跟踪轮到谁和下一个轮到谁。轮到玩家后,将其添加回队列末尾。
实际上,现在我想起来了,没有理由同一个解决方案不能处理多个进程或套接字。
只需要排队
--编辑--
所以您需要的是一个带有阻塞方法的类。例如
所以仍然使用您的队列,您遍历每个玩家并调用getmove(),它将阻止,直到玩家发布移动。
顺便说一句,这种阻塞类似于inputstream.read(缓冲区)在套接字中的工作方式。调用read的线程等待流的另一端发送一些内容。
--编辑2--
作为提醒:不要在线程对象上使用synchronized、wait、notify或notifyall。