CountDownLatch และ CyclicBarrier ใช้ในสภาพแวดล้อมแบบมัลติเธรดและทั้งคู่ก็เป็นส่วนหนึ่ง
ตาม Java Doc -
CountDownLatch - ตัวช่วยการซิงโครไนซ์ที่ช่วยให้เธรดหนึ่งหรือหลายเธรดรอจนกว่าชุดของการดำเนินการในเธรดอื่นจะเสร็จสิ้น
CyclicBarrier - ตัวช่วยการซิงโครไนซ์ที่ช่วยให้ชุดของเธรดทั้งหมดรอกันและกันถึงจุดกั้นทั่วไป
| ซีเนียร์ เลขที่ | คีย์ | CyclicBarrier | CountDownLatch |
|---|---|---|---|
| 1 | พื้นฐาน | ตัวช่วยการซิงโครไนซ์ที่ช่วยให้ชุดของเธรดที่รอกันและกันถึงจุดกั้นทั่วไป | ตัวช่วยการซิงโครไนซ์ที่ช่วยให้เธรดหนึ่งหรือหลายเธรดรอจนกว่าชุดของการดำเนินการในเธรดอื่นจะเสร็จสิ้น |
| 2 | Ruunable | มีคอนสตรัคเตอร์ที่สามารถจัดเตรียม Runnable ได้ | ไม่มีตัวสร้างดังกล่าว |
| 3 | กระทู้ /Task | มันรักษาจำนวนเธรด | นับจำนวนงาน |
| 4. | ขั้นสูง | มันไม่ก้าวหน้า | เป็นเรื่องที่ก้าวหน้า |
| 5 | ข้อยกเว้น | หากเธรดหนึ่งถูกขัดจังหวะขณะรอ เธรดอื่นที่รออยู่ทั้งหมดจะส่ง B rokenBarrierException | เฉพาะกระทู้ปัจจุบันเท่านั้นที่จะโยน InterruptedException. จะไม่กระทบกับกระทู้อื่นๆ |
ตัวอย่าง CyclicBarrier
public class Main {
public static void main(String args[]) throws InterruptedException {
ExecutorService executors = Executors.newFixedThreadPool(4);
CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
executors.submit(new Service1(cyclicBarrier));
executors.submit(new Service1(cyclicBarrier));
executors.submit(new Service2(cyclicBarrier));
executors.submit(new Service2(cyclicBarrier));
executors.submit(new Service2(cyclicBarrier));
Thread.sleep(3000);
System.out.println("Done");
}
}
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Service1 implements Runnable {
CyclicBarrier cyclicBarrier;
public Service1(CyclicBarrier cyclicBarrier) {
super();
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
System.out.println("Services1" + cyclicBarrier.getNumberWaiting());
while (true) {
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Service2 implements Runnable {
CyclicBarrier cyclicBarrier;
public Service2(CyclicBarrier cyclicBarrier) {
super();
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
System.out.println("Services2" + cyclicBarrier.getNumberWaiting());
while (true) {
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} ตัวอย่าง CountDownLatch
public class Main {
public static void main(String args[]) throws InterruptedException {
ExecutorService executors = Executors.newFixedThreadPool(4);
CountDownLatch latch= new CountDownLatch(2);
executors.submit(new Service1(latch));
executors.submit(new Service2(latch));
latch.await();
System.out.println("Done");
}
}
import java.util.concurrent.CountDownLatch;
public class Service1 implements Runnable {
CountDownLatch latch;
public Service1(CountDownLatch latch) {
super();
this.latch = latch;
}
@Override
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
latch.countDown();
System.out.println("Services2"+latch.getCount());
}
}
import java.util.concurrent.CountDownLatch;
public class Service2 implements Runnable {
CountDownLatch latch;
public Service2(CountDownLatch latch) {
super();
this.latch = latch;
}
@Override
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
latch.countDown();
System.out.println("Services2"+latch.getCount());
}
}