2016-03-21 10 views
-1

Ich bin neu in der Idee, Threads zu verwenden und habe ziemlich viel Ärger mit ihnen. Der Methodenaufruf displayComplexStimulus (phase1Trial.getComplexStimulus()) zeigt eine Reihe von jlabels (phase1CompoundLabels), die Bilder enthalten, auf dem Bildschirm an.Java - Probleme mit der Ausführung von Threads nacheinander

Was ich versuche zu tun ist, dass diese Gruppe von Jabels für zwei Sekunden angezeigt wird und dann verschwinden. Wenn ich den Code nicht einschließe, der den CompoundThread-Thread und den AlternativenThread-Thread instanziiert, ausführt und verbindet, werden die Bilder ordnungsgemäß angezeigt. Wenn ich jedoch den Code einfüge, der die beiden Threads instanziiert, ausführt und verbindet, erscheinen die Bilder nicht einmal, wenn ich versuche, die jlabels für zwei Sekunden zu erscheinen, bevor sie verschwinden.

Bin ich richtig, dass das Problem darin besteht, dass der AlternativenThread nicht wartet, bis der CompoundThread fertig ist, bevor er seine Ausführung startet? Ich bin verwirrt darüber, warum dies der Fall ist, da ich mich den beiden Fäden angeschlossen habe. Wenn jemand mir helfen könnte zu verstehen, warum mein Code nicht wie beabsichtigt funktioniert, würde ich es begrüßen.

public void phase1() { 

    while (totalNoOfPhase1Trials > 399) { 
     Phase1Trial phase1Trial = new Phase1Trial(numberOfElements, elementColors); 

     displayComplexStimulus(phase1Trial.getComplexStimulus()); 
     validate(); 


     Thread compoundThread = new Thread(new Runnable() { 

      public void run() { 
       try { 
        Thread.currentThread().sleep(2000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        Thread.currentThread().interrupt(); 
       } 
      } 

     }); 

     Thread alternativesThread = new Thread(new Runnable() { 
      public void run() { 

       for (int i = 0; i < numberOfElements; i++) { 
        remove(phase1CompoundLabels[i]); 
       } 
       validate(); 
      } 
     }); 

     compoundThread.start(); 
     alternativesThread.start(); 


     try { 
      compoundThread.join(); 
      alternativesThread.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     totalNoOfPhase1Trials--; 
    } 
} 
+0

Ja. 'alternateThread' wartet nicht auf' compoundThread', um die Ausführung zu beenden. Ein Weg (ich bin mir ziemlich sicher, dass das kein guter Weg ist) könnte darin bestehen, eine while-Schleife oder etwas zu blockieren, während 'compoundThread' am Leben ist. Ein besserer Weg wäre eine Rückrufaktion. In deinem Fall könnte der try-catch-Block schließlich einen "alternateThread" erzeugen. –

+0

Wenn Sie möchten, dass zwei Codeabschnitte nacheinander ausgeführt werden, benötigen Sie nur einen Thread. –

+0

Debosmit - Ich instanziiert die AlternativenThread in einer while-Schleife (mit der Bedingung, dass, während die compoundThread am Leben ist es nicht ausgeführt), und es nur teilweise behoben mein Problem, wie jetzt die Bilder angezeigt werden, aber sie nicht nach zwei Sekunden verschwinden. – lb91

Antwort

0

Wenn Sie alternativesThread nach Abschluss der compoundThread dann laufen bitte schreiben alternativesThread.start(); in der run() -Methode von compoundThread Also, es bis zur Verarbeitung von compoundThread abgeschlossen ist warten.

+0

Was Sie meinen, ist, den neuen Thread am Ende der 'run()' Methode zu starten. –

+0

Das würde bedeuten, dass ich den AlternativenThread-Thread global deklarieren muss, oder? – lb91