Java併發包-CountDownLatch

java.util.concurrent 
類 CountDownLatch

java.lang.Object
  ∟-java.util.concurrent.CountDownLatch

CountDownLatchhtml

直譯過來就是倒計數(CountDown)門閂(Latch)。倒計數不用說,門閂的意思顧名思義就是阻止前進。在這裏就是指 CountDownLatch.await() 方法在倒計數爲0以前會阻塞當前線程。java

做用api

CountDownLatch 的做用和 Thread.join() 方法相似,可用於一組線程和另一組線程的協做。例如,主線程在作一項工做以前須要一系列的準備工做,只有這些準備工做都完成,主線程才能繼續它的工做。這些準備工做彼此獨立,因此能夠併發執行以提升速度。在這個場景下就能夠使用 CountDownLatch 協調線程之間的調度了。在直接建立線程的年代(Java 5.0 以前),咱們能夠使用 Thread.join()。在 JUC 出現後,由於線程池中的線程不能直接被引用,因此就必須使用 CountDownLatch 了。併發

package zy.test;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class CountDownLatchTest {

	public static void main(String[] args) {
		/**
		 * 需求:woker3 必須在 woker1和woker2執行完以後再執行
		 */
		CountDownLatch countDownLatch=new CountDownLatch(2);
		Thread woker1 = new Thread(new Worker("woker1", 5, countDownLatch));
		Thread woker2 = new Thread(new Worker("woker2", 5, countDownLatch));
		Thread woker3 = new Thread(new Worker("woker3", 3, countDownLatch));
		woker1.start();
		woker2.start();
		try {
			countDownLatch.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("worker1和worker2執行完成");
		woker3.start();
	}
}
class Worker implements Runnable{

	private String workName;
	
	private long time;
	
	private CountDownLatch countDownLatch;
	
	public Worker(String workName, long time,CountDownLatch countDownLatch) {
		super();
		this.workName = workName;
		this.time = time;
		this.countDownLatch=countDownLatch;
	}


	@Override
	public void run() {
		System.out.println(workName+" 開始工做。。。");
		try {
			TimeUnit.SECONDS.sleep(time);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(workName+" 工做了 "+time+"秒後結束");
		countDownLatch.countDown();
		
	}
	
}

運行結果:ide

相關文章
相關標籤/搜索