CountDownLatch와 CyclicBarrier는 모두 멀티 스레드 환경에서 사용되며 둘 다 멀티 스레드 환경의 일부입니다.
Java Doc에 따르면 -
CountDownLatch - 하나 이상의 스레드가 다른 스레드에서 수행되는 일련의 작업이 완료될 때까지 기다릴 수 있도록 하는 동기화 지원입니다.
CyclicBarrier - 스레드 그룹이 서로 공통 장벽 지점에 도달할 때까지 기다릴 수 있도록 하는 동기화 보조 도구입니다.
미스터. 아니요. | Key | CyclicBarrier | CountDownLatch |
---|---|---|---|
1 | Basic | 을 사용하면 서로가 공통 장벽 지점에 도달하기를 기다리는 스레드 집합의 동기화를 허용합니다. | 하나 이상의 스레드가 다른 스레드에서 수행된 일련의 작업이 완료될 때까지 기다릴 수 있도록 하는 동기화 지원입니다. |
2 | Runnable | Runnable을 제공하는 생성자가 있습니다. | 해당 생성자가 없습니다 | 3 | Threads/Tasks | 스레드 수를 유지합니다 | 작업 수를 유지합니다
| tr>
4.
| 고급 가능 | 사용을 권장하지 않습니다. | 사용을 권장합니다. |
5 | 예외 | 한 스레드가 대기 중에 중단되면 다른 모든 대기 스레드는 B rokenBarrierException | 을 발생시킵니다. 현재 스레드만 InterruptedException을 발생시키며 다른 스레드에는 영향을 주지 않습니다. 스레드 |
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(); } } } }
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()); } }
위 내용은 Java 동시성에서 CountDownLatch와 CyclicBarrier의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!