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