CountDownLatchの使用


いくつかの応用場面では、ある条件が要求に達してから後のことをする必要があります.また、スレッドが完了するとイベントがトリガーされ、後続の操作が行われます.この時はCountDownLatchが使えます.CountDownLatchの最も重要な方法はcountDown()とawait()であり、前者は主に逆数であり、後者は逆数を0まで待つことであり、0に達しなければブロック待つしかない.
 
CountDownLatchは、他のスレッドで実行されている操作のセットを完了する前に、1つ以上のスレッドを待機させる同期支援クラスです.与えられたカウントでCountDownLatchを初期化します.countDown()メソッドが呼び出されるため、現在のカウントがゼロに達するまでawait()メソッドはブロックされます.その後、待機しているすべてのスレッドが解放され、awaitの後続呼び出しはすぐに返されます.
 
次に使用例を示します.
 
 
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestLock {

	static CountDownLatch cdl = null;

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		//  
		final ExecutorService exec = Executors.newCachedThreadPool();

		Runnable main = new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 5; i++) {

					cdl = new CountDownLatch(1);//  , 1

					System.out.println(" :" + i);
					updateData(i);//  

					//  
					exec.execute(createTask(i));

					try {
						cdl.await();//  
					} catch (InterruptedException e) {
						e.printStackTrace();
					}

					System.out.println(" :" + i);
				}
				cdl = null;
				System.out.println(cdl);
			}
		};

		exec.execute(main);
	}

	private static void updateData(int i) {
		System.out.println(" :" + i);
	}

	private static Runnable createTask(final int k) {
		return new Runnable() {
			@Override
			public void run() {
				try {
					Thread.sleep(5000);//  
					System.out.println(" " + k);

				} catch (InterruptedException e) {
					System.out.println(" " + k);
					e.printStackTrace();
				} finally {
					cdl.countDown();// 
				}
			}
		};
	}
}