2017-04-21 29 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(),然后根据结果完成其他任务。

相关问题