2 Stimmen

Threads in Java

Ich habe ein einfaches Programm zum Testen von Threads in Java erstellt. Ich möchte, dass es mir unendlich viele Zahlen ausgibt, wie 123123123123123. Keine Ahnung warum, aber im Moment stoppt es nach einem Zyklus und beendet nur 213. Weiß jemand, warum?

public class Main {
    int number;

    public Main(int number){
    }

    public static void main(String[] args) {
        new Infinite(2).start();
        new Infinite(1).start();
        new Infinite(3).start();
    }
}

class Infinite extends Thread {
    static int which=1;
    static int order=1;
    int id;
    int number;
    Object console = new Object();

    public Infinite(int number){
        id = which;
        which++;
        this.number = number;
    }

    @Override
    public void run(){
        while(1==1){
            synchronized(console){
                if(order == id){
                    System.out.print(number);
                    order++;
                    if(order >= which){
                        order = 1;
                    }
                    try{
                        console.notifyAll();
                        console.wait();
                    }
                    catch(Exception e)
                    {}                    
                }
                else {
                    try{
                        console.notifyAll();
                        console.wait();
                    }
                    catch(Exception e)
                    {}                    
                }
            }
            try{Thread.sleep(0);} catch(Exception e) {}
        }
    }
}

9voto

Chris Punkte 10147

Jeder Ihrer Infinite Instanzen synchronisiert und wartet dann auf eine Benachrichtigung über seine eigene console Objekt. Sobald der Thread zu console.wait() wird es nicht weitergehen.

Sie scheinen zu wollen, dass sie alle mit demselben Objekt synchronisiert werden - also müssen Sie zum Beispiel die console statisch.

3voto

Inv3r53 Punkte 2869

Die Threads sind blockiert und warten wahrscheinlich darauf, den Monitor zu erhalten, um wait aufzurufen. Sie verwenden den Wait-Notify-Mechanismus nicht richtig.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#wait%28%29

2voto

VHans Punkte 71

Jeder Thread synchronisiert sich auf ein anderes Objekt. Wenn die Steuerung an console.wait() geht, wartet der ausführende Thread darauf, dass ein anderer Thread notify()/notifyAll() für das Steuerungsobjekt aufruft. Es gibt keinen anderen Thread, der dies tut, da jeder Thread seine eigene Kopie des Steuerobjekts besitzt. Daher warten alle Threads auf unbestimmte Zeit, nachdem sie nur einmal gedruckt haben. Um dieses Problem zu lösen, halten Sie ein gemeinsames Objekt vor, auf das alle Threads warten können.

1voto

Bitte beachten Sie, dass System.out.print(..) wird die Ausgabe nicht automatisch gespült.

Werfen Sie auch einen Blick auf java.util.concurrent.Semaphore . Sie könnten in der Lage sein, das zu tun, was Sie versuchen (Threads in vordefinierter Reihenfolge ausführen), ohne zu synchronisieren und Wartezeiten aufzurufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X