gpt4 book ai didi

java - Java多线程奇怪的问题。某些线程自行关闭?

转载 作者:行者123 更新时间:2023-11-30 05:53:50 25 4
gpt4 key购买 nike

我在使用一个模拟 N 个随机玩家的轮盘游戏的简单程序时遇到问题。该程序工作 2-3 次,而不是意外停止,因为我认为,线程处于等待状态或类似的情况。我知道代码不太好(就像我的英语一样),但这是我的第一次尝试。任何建议都非常感激。抱歉,如果代码不太干净,我真的找不到其他方法来执行此程序。

public class RouletteMultipla implements Runnable {
private int a;
private int ng; //number of player

public RouletteMultipla(int f) {
ng = f;
}

int numero = 0;

public void ingioco() {
a++; //How many player have put money
}

public void morto() {
System.out.println("One player is died"); //Run out of Money
ng--;
}

public void run() {
while (true) {
synchronized (this) {
if (a == ng) { //until all player have put money
numero = (new Numero().num); //Random from 0 to 36
System.out.println("E' USCITO " + numero + "\n ");
a = 0;
for (double j = 0; j < 10000000; j = j + 0.1);
notifyAll();
}

}

}

}

public static void main(String[] args) {
int ng = (int) (Math.random() * 14) + 1;
RouletteMultipla r = new RouletteMultipla(ng);
Thread roulette = new Thread(r);


for (int i = 0; i < ng; i++) {
Giocatore g = new Giocatore(i, r, ng); //create n player
g.start();

}
roulette.start(); //create one roulette
roulette.setPriority(10);

}

这是玩家类

public class Giocatore extends Thread {

private int id; //id of player
private int ng; //number of player

int soldi = 100; //money at start
int numero; //number
int puntata = 1; //roulette play at start

Giocatore(int i, RouletteMultipla s, int b) {
id = i;
r = s;
ng = b;
}

RouletteMultipla r = new RouletteMultipla(ng);

public void run() {

while (soldi > 0) {
numero = ((int) (Math.random() * 35)) + 1;
puntata = (int) (Math.random() * (soldi - 1)) + 1;
soldi = soldi - puntata;
System.out.println("ID:" + id + " Puntata:" + puntata + " Numero:" + numero + " SOLDI:" + soldi);

r.ingioco(); //Increase "a variable"
try {
synchronized (r) {
r.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
if (numero == r.numero) {
soldi = soldi + puntata * 36;
System.out.println("Giocatore " + id + " HA VINTOOOOOOOOOO");
}

}
r.morto(); // when money=0
}

}

最佳答案

可能还有其他问题,但对我来说最突出的一个问题是对 ng 变量的访问不是同步的,也不是原子的:

public void morto() {
System.out.println("One player is died"); //Run out of Money
ng--;
}

如果多个(玩家)线程同时调用此方法,则无法保证 ng-- 实际上会导致 ng 包含正确的玩家数量。

理解该问题的最简单方法可能是将n--; 视为与n = n - 1; 相同。现在,如果两个线程同时运行此操作,它们可能都将 n 读取为相同的值(例如 10),并且都存储相同的递减结果(例如 9)。尽管有两个线程已完成,但计数比应有的值高一。

您可能应该将该方法声明为synchronized。我认为 ingioco 方法也存在类似的问题。

关于java - Java多线程奇怪的问题。某些线程自行关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53498183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com