[Java] Probleme mit Thread Synchronisation

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von S1l3ntk1ll, 3. Februar 2011 .

  1. 3. Februar 2011
    Probleme mit Thread Synchronisation

    Hey Jungs, ich habe folgendes Problem:

    Code:
    public synchronized void run() {
     while (true) {
     laufeZurWand();
     kehrt();
     int aktiv = activeCount();
     while(aktiv > 1) {
     try {
     this.wait();
     } 
     catch (InterruptedException e) {}
     }
     notifyAll();
     }
     }
    
    Erläuterung: laufeZurWand() ist einfach eine funktion die bis zu einer "Wand" läuft, sich dann mit kehrt() umdreht und dann auf die anderen Threads warten soll, so dass diese wieder alle gleichzeitig in die andere Richtung laufen (ich hoffe ihr wisst wie ich das meine ^^)

    Mein eigentliches Problem ist jetzt das der activeCount() sich scheinbar beim wait nicht ändert, und ich somit nicht weiss wie ich rausfinden wieviele Threads gerade am warten sind!

    Danke schonmal für Hilfe!
     
  2. 3. Februar 2011
    AW: Probleme mit Thread Synchronisation

    Du setzt aktiv nur einmal, wie soll es da kleiner werden?

    PHP:
    public  synchronized void run () {
            while (
    true ) {
                
    laufeZurWand ();
                
    kehrt ();
                
    int aktiv  activeCount ();
                while(
    aktiv  1 ) {
                    try {
                        
    this . wait ();
                        
    aktiv  activeCount ();
                    } 
                    catch (
    InterruptedException e ) {}
                }
                    
    notifyAll ();
            }
    }
    greez
     
  3. 3. Februar 2011
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Probleme mit Thread Synchronisation

    nene, so meinte ich das nicht, ich poste hier mal den completten Code damit man das eventuell besser versteht:

    Code:
    class LaufHamster extends Hamster {
     LaufHamster(int reihe) {
     super(reihe, 0, Hamster.OST, 0);
     }
    
     public synchronized void run() {
     while (true) {
     laufeZurWand();
     kehrt();
     int aktiv = activeCount();
     while(aktiv > 1) {
     try {
     this.wait();
     } 
     catch (InterruptedException e) {}
     }
     notifyAll();
     }
     }
    
     void laufeZurWand() {
     while (vornFrei()) {
     vor();
     }
     }
    
     void kehrt() {
     linksUm();
     linksUm();
     }
     
    }
    
    void main() {
     LaufHamster[] laeufer = new LaufHamster[Territorium.getAnzahlReihen()];
     for (int r=0; r < laeufer.length; r++) {
     laeufer[r] = new LaufHamster(r);
     }
     for (int r=0; r < laeufer.length; r++) {
     laeufer[r].start();
     }
    }
    
    
    die Hamster sollen also bis zu der Wand laufen (alle) und erst wenn ALLE! angekommen sind sollen sie wieder loslaufen zur anderen seite!

    //EDIT:

    hier noch ein Bild zur veranschaulichung:

    Bild
     
  4. 3. Februar 2011
    AW: Probleme mit Thread Synchronisation

    hm, ich an deiner stelle würde mit einem ReentrantLock arbeiten, und da ne condition machen für alleAngekommen. damit bist du sicher (bei korrekter anwendung), dass die threads synchronisiert sind, und mit signalAll() kannst du dann alle loslaufen lassen.

    Mehr zum ReentrantLock gibts in der JAVA API, falls du ein anwendungsbeispiel suchst->PN.

    mfg swissmaster
     
  5. 3. Februar 2011
    AW: Probleme mit Thread Synchronisation

    Ich glaub ich hab dein Prob verstanden: Du meinst, dass dein Thread noch aktiv ist, obwohl er eigentlich wartet. Das kannst du glaub nur vermeiden, in dem du alle Thread fertig werden lässt, dann wird die Anzahl der aktiven Thread kleiner. Sonst brauchst eine statische Variable die dir deine aktiven Threads zählst. Und während die anderen noch arbeiten legst du die fertigen Threads mit sleep in einer Schleife einfach schlafen.

    Hoffe du verstehst was ich meine. Sonst poste mal noch die Hamster.java und ich schaue ob ich das bauen kann.

    greez
     
  6. 3. Februar 2011
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Probleme mit Thread Synchronisation

    hab mal die Hamster.java hochgeladen auf XUP

    --Hier

    btw: es handelt sich bei der ganzen sache um den "Hamster-Simulator" falls mal wer googeln will, da kann man auch einfach den code reinhauen und selbst schauen was passiert!
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.