2016-09-30 18 views
-1

私は同時に2つのタスクを実行している3つのメソッドがあります。これらのタスクの1つはスレッド間で共通ですが、私は3つのタスクがそれを呼び出すためのユニークなメソッドを書く方法を知らない。一般的なメソッドに同じスレッドを書き込む方法は?

private void compare(String path) { 
    Thread t1 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       // do something 
       finished = true; 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    Thread t2 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try{ 
       while(!finished){ 
        statusLabel.setText("P-R-O-C-E-S-S-A-N-D-O"); 
        Thread.sleep(500); 
        statusLabel.setText(""); 
        Thread.sleep(500); 
       } 
       finished = false; 
       statusLabel.setText(""); 
      }catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 
     } 
    }); 

    t1.start(); 
    t2.start(); 

} 

private void sobeNovaBaseBlackList(String path){ 
    Thread t1 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      //do another thing 
      finished = true; 
     } 
    }); 


    Thread t2 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try{ 
       while(!finished){ 
        statusLabel.setText("P-R-O-C-E-S-S-A-N-D-O"); 
        Thread.sleep(500); 
        statusLabel.setText(""); 
        Thread.sleep(500); 
       } 
       finished = false; 
       statusLabel.setText(""); 
      }catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 
     } 
    }); 


    t1.start(); 
    t2.start(); 
} 

private void sobeNovaBaseFornecedor(){ 
    Thread t1 = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // do anything 
      finished= true; 
     } 
    }); 

    Thread t2 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try{ 
       while(!finished){ 
        statusLabel.setText("P-R-O-C-E-S-S-A-N-D-O"); 
        Thread.sleep(500); 
        statusLabel.setText(""); 
        Thread.sleep(500); 
       } 
       finished = false; 

      }catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 
     } 
    }); 

    t1.start(); 
    t2.start(); 
} 

ご覧のとおり、スレッド2(t2)はすべての方法で同じ動作をします。一度だけt2を書くには?

答えて

0

Runnable(例:class Task2 implements Runnable)を実装し、実行メソッドでスレッド2のコードを書き込む新しいクラスを作成します。次に、両方の方法でそれをインスタンス化します。

0

Runnableインターフェイスを実装して共通コードをそこに置くことができます。以下のような 何か:

public class ThreatT2 implements Runnable { 
    private Boolean finished; 

    public Test(Boolean finished) { 
    this.finished = finished; 
    } 

    @Override 
    public void run() { 
    try{ 
     while(!finished){ 
     statusLabel.setText("P-R-O-C-E-S-S-A-N-D-O"); 
     Thread.sleep(500); 
     statusLabel.setText(""); 
     Thread.sleep(500); 
     } 
     finished = false; 
     statusLabel.setText(""); 
    } catch(InterruptedException e){ 
     e.printStackTrace(); 
    } 
    } 
} 

は、その後、あなたがコードを呼び出すには、あなたは大丈夫、runメソッド

ThreatT2 t = new ThreatT2(true); 
t.start(); 
+0

を呼び出すことができますが、どのように私はT2を終える必要がありますか?私はt1が終了したら、t2が同時に終了する必要があります。 –

+0

t1とt2は相互に独立しているため、時間保証が難しくなります。呼び出し元を終了する前に両方のスレッドが処理するのをブロックする場合は、 'Joins'または' CountDownLatch'を使用して、 – Richeek

関連する問題