首页 > 代码库 > java多线程编程之CountDownLatch

java多线程编程之CountDownLatch

java.util.concurrent.CountDownLatch这个类里面的主要方法为:

1.countDown(),Decrements the count of the latch, releasing all waiting threads if the count reaches zero.

2.await(),Causes the current thread to wait until the latch has counted down to zero, unless the thread is interrupted.

//Runner.java
package com.cc;
import java.util.concurrent.CountDownLatch;

public class Runner implements Runnable{
	private CountDownLatch latch;
	private int index;

	public Runner(int index){
		this.index = index;
	}
	
	public Runner(CountDownLatch latch, int index){
		this.latch = latch;
		this.index = index;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			Thread.sleep(10);
			latch.countDown();
			System.out.println("latch countDown :"+this.index);
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("latch countDown:"+this.index+"end");
	}
	public CountDownLatch getLatch() {
		return latch;
	}
	public void setLatch(CountDownLatch latch) {
		this.latch = latch;
	}

}


//test.java
package com.cc;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CountDownLatch latch = new CountDownLatch(10);
		ExecutorService execServ = Executors.newFixedThreadPool(10);
		for (int i = 0; i < 10; i++) {
			execServ.submit(new Runner(latch, i));
		}
		try {
			Thread.sleep(1);
			latch.await();
			System.out.println("latch await through pass");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("--end--");
	}

}

  

//Runner.java
package com.cc;
import java.util.concurrent.CountDownLatch;

public class Runner implements Runnable{
	private CountDownLatch latch;
	private CountDownLatch backLatch;
	private int index;

	public Runner(int index){
		this.index = index;
	}
	
	public Runner(CountDownLatch latch, CountDownLatch backLatch, int index){
		this.latch = latch;
		this.backLatch = backLatch;
		this.index = index;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			System.out.println("latch countDown :"+this.index);
			latch.countDown();
			System.out.println("latch:"+this.index);
			backLatch.await();
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		System.out.println("latch countDown:"+this.index+"end");
	}
	public CountDownLatch getLatch() {
		return latch;
	}
	public void setLatch(CountDownLatch latch) {
		this.latch = latch;
	}

	public CountDownLatch getBackLatch() {
		return backLatch;
	}

	public void setBackLatch(CountDownLatch backLatch) {
		this.backLatch = backLatch;
	}

}

//Test.java
package com.cc;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CountDownLatch latch = new CountDownLatch(10);
		CountDownLatch backLatch = new CountDownLatch(1);
		ExecutorService execServ = Executors.newFixedThreadPool(10);
		for (int i = 0; i < 10; i++) {
			execServ.submit(new Runner(latch, backLatch,i));
		}
		try {
			latch.await();
			System.out.println("latch await through pass");
			backLatch.countDown();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("--end--");
	}

}

  

 

java多线程编程之CountDownLatch