我目前正在学习Java中的多线程并尝试编写我的第一个多线程游戏。我的游戏中的线程是使用类Game
中的函数的玩家,同时使用类Cars
中的函数来更改Cars
中的数据。我注意到我的线程不是同时开始的; Thread-1已经改变了数据,而Thread-2还没有开始。
Go player0
Go player1
Go player2
196 // player0 changed data in Cars
Go player3
196 // player1 changed data in Cars
我在Game
class
public void createPlayers() throws Exception{
for(int i = 0; i < num; ++i){
Player p = new Player(i);
p.start();
System.out.println("Go "+p.name);
}
}
起初我认为这是同步问题,因为我的线程使用来自synchronised
类的Game
方法,该方法使用类synchronised
中的Cars
方法。
//function from Game
`public synchronized void changeTire(){
int rnd = new Random().nextInt(hand.length());
int rnd2 = new Random().nextInt(tires.length);
discard(hand.get(rnd),lasttire); // function from Car
this.lastBag = rnd2;
}
但删除 - 更改同步方法并没有解决问题。我能以某种方式在run()方法中修复它吗?
班级选手:
public class Player extends Thread {
volatile int n;
String name;
PrintWriter b;
int lasttire;
AtomicIntegerArray hand;
public Player(int a) throws IOException {
n = a;
this.name = "player"+n;
Thread.currentThread().setName(this.name);
String file = "player"+n+"_output.txt";
b = new PrintWriter(file,"UTF-8");
}
public void run(){
if (gameOn) {
takeHand();
while (sum() != 100 && !isInterrupted()) {
changeTire();
try {
Thread.sleep(100);
} catch (InterruptedException b) {
System.out.println("We have a winner!");
}
}
System.out.println("to");
StopGame();
}else{
b.close();
}
}
答案 0 :(得分:0)
尝试检查是否存在威胁,if(thread.isAlive()){}