2016-03-21 16 views
-1

スレッドを使用するという考え方が新しく、問題がかなりあります。メソッド呼び出しdisplayComplexStimulus(phase1Trial.getComplexStimulus())は、画像を含むjlabels(phase1CompoundLabels)のセットを画面に表示します。Java - スレッドを作成する際に問題が発生する

私がしようとしているのは、そのラベルのセットを2秒間表示してから消えることです。私がインスタンス化して、compoundThreadスレッドとalternativesThreadスレッドを実行して結合するコードを含まないと、画像はうまく表示されます。しかし、インスタンス化して実行して2つのスレッドを結合するコードを含めると、jlabelsが消える前に2秒間表示されようとしているときに画像が表示されることはありません。

compoundThreadが実行を開始する前にalternativesThreadが実行を終了するまで問題がないことを修正しましたか?私は2つのスレッドに参加しているので、なぜこれが当てはまるのか混乱しています。誰かが私のコードが意図したとおりに動作しない理由を理解するのを助けることができたら、それは感謝します。

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

はい。 'alternativeThread'は' compoundThread'の実行が完了するのを待っていません。一つの方法(これは良い方法ではないと確信しています)は、 'compoundThread'が生きている間にwhileループや何かをブロックすることができます。より良い方法は、コールバックの形式を行うことです。あなたの場合、try-catchブロックはfinallyを持つことができ、 'alternativeThread'を生成することができます。 –

+0

2つのコードを順番に実行する場合は、スレッドが1つだけ必要です。 –

+0

Debosmit - 私はalternativesThreadをwhileループでインスタンス化しました(compoundThreadは実行中の状態では実行されないという条件で)、問題は部分的にしか修正されませんでした.2秒後に画像は表示されますが消えません。 – lb91

答えて

0

あなたがcompoundThreadの完了後alternativesThreadを実行したい場合は、そう、それはcompoundThread完了の処理まで待機しますcompoundThreadのrun()メソッド内alternativesThread.start();を書いてください。

+0

あなたは、 'run()'メソッドの最後に新しいスレッドを開始することを意味します。 –

+0

これは、alternativesThreadスレッドをグローバルに宣言する必要があることを意味します。 – lb91