2017-04-21 20 views
1

以下のようにrunメソッドがあるとします。私はMyThread用に4つのスレッドを作成しようとしています。ステートメント1〜3は、同時にスレッドごとに実行することも、別々に実行することもできます。しかし、私はステートメント4が同時にスレッドによって実行されることを望みます。文4の前にすべてのスレッドをプールし、すべてのスレッドが文4を同時に実行できますか?Javaスレッド:文を同時に実行する方法

class MyThread extends Thread 
{ 
    public void run() 
    { 
     //Statement 1 
    //Statement 2 
    //Statement 3 
    //Statement 4 
    } 

} 
+1

Javaのスレッド、並行性、同期に関する大きな誤解があると思います。私は[Oracleの同時実行性](https://docs.oracle.com/javase/tutorial/essential/concurrency/)をお勧めします。私があなたに与えることができる唯一の "答え"は、あらかじめコピーして貼り付けることができるプリベークされたコードですが、あなたは何も学ばないでしょう。 – Turing85

+0

はい、できます。 1つの方法は、クラス[java.util.concurrent.CountdownLatch](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html)の使用によるものです。カウント3で作成し、最初の3つのスレッドのそれぞれの終わりにカウントダウンし、4番目のスレッドでゼロに達するのを待ちます。 –

+1

すべてのスレッドがステートメント3を終了するまで、スレッドがステートメント4を開始しないようにすることを意味しますか? –

答えて

1

CyclicBarrierを使用すると、要件に最適です。

import java.util.concurrent.BrokenBarrierException; 
import java.util.concurrent.CyclicBarrier; 

public class CyclicBarrierUsage { 

    private static final int NUMBER_OF_THREADS = 2; 

    public static void main(String[] args) { 
     CyclicBarrier barrier = new CyclicBarrier(NUMBER_OF_THREADS); 

     Thread t1 = new Thread(new PrimaryParty(barrier)); 
     Thread t2 = new Thread(new PrimaryParty(barrier)); 

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

class PrimaryParty implements Runnable { 

    private CyclicBarrier barrier; 

    public PrimaryParty(CyclicBarrier barrier) { 
     this.barrier = barrier; 
    } 

    @Override 
    public void run() { 
     //Statement 1 
     //Statement 2 
     //Statement 3 

     try { 
      barrier.await(); 
     } catch (InterruptedException | BrokenBarrierException e) { 
      e.printStackTrace(); 
     } 

     //Statement 4 
    } 
} 
+0

ありがとうございます@PardeepDogra。サンプルプロジェクトで動作します。実装を試してみましょう。 –

1

必要な操作を行う方法はいくつかあります。おそらく最も簡単な方法は、Javaの実装をFutureにすることです。個別のスレッドで実行される1つ(または複数)のFuturesを定義し、すべてがFuture.get()で終了するまでブロックし、結果に基づいて他のタスクを完了できます。

関連する問題