Странная проблема многопоточной Java. Какая-нить закрывается сама? [Дубликат]

Marco Pellegrino спросил: 03 ноября 2018 в 09:20 в: java

На этот вопрос уже есть ответ:

  • What is a debugger and how can it help me diagnose problems? 2 ответа

У меня проблема с простой программой, имитирующей игру в рулетку с N случайным игроком. Программа работает 2 -3 раза, чем случайно остановиться, потому что, я думаю, поток остается в ожидании или что-то в этом роде. Я знаю, что код не так хорош (как мой английский), но это моя первая попытка. Любые предложения действительно приветствуются. Извините, если код не очень чистый, я действительно не нахожу других способов сделать эту программу.

public class RouletteMultipla implements Runnable {
private int a;
private int ng; //number of playerpublic 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);}

Это класс Player

public class Giocatore extends Thread {private int id; //id of player
private int ng; //number of playerint soldi = 100; //money at start
int numero; //number
int puntata = 1; //roulette play at startGiocatore(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
}
}

0 ответов