2017-04-21 30 views
1

考慮我有一個run方法如下,我想爲MyThread創建四個線程。語句1到3可以由線程同時運行或不同。但是我希望Statement 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

是的,你可以。一種方法是通過使用類[java.util.concurrent.CountdownLatch](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html)。創建它的計數爲3,在前三個線程中每個線程的末尾倒計數,並等待它在第四個線程中達到零。 –

+1

你的意思是你不想讓任何線程啓動語句4,直到所有線程完成語句3? –

回答

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實現。您可以定義一個(或多個)期貨,這些期貨將在單獨的線程上執行,直到全部完成Future.get(),然後根據結果完成其他任務。

相關問題