JUC(Java.util.concurrent)是Java 5中引入的一個并發編程庫,它包含了許多用于多線程處理的工具類和接口。JUC主要提供了以下特性:
線程池:線程池可以提高線程的使用效率,避免頻繁地創建和銷毀線程,從而使得應用程序的性能得到提升。
并發集合類:JUC提供了一些線程安全的集合類,如ConcurrentHashMap、CopyOnWriteArrayList等,可以在多線程環境下安全地操作集合。
原子操作類:JUC提供了一些原子操作類,如AtomicInteger、AtomicLong等,可以在多線程環境下安全地操作共享變量。
同步器:JUC提供了一些同步器,如Semaphore、CountDownLatch、CyclicBarrier等,可以協調多個線程之間的執行。
并發工具類:JUC還提供了一些并發工具類,如Lock、Condition等,可以代替傳統的synchronized關鍵字,提供更靈活、更高效的線程同步機制。
CountDownLatch和CyclicBarrier都是Java中用于多線程編程的工具類,屬于同步器的一種。它們都可以用于控制多個線程的執行順序。
?代碼示例
CountDownLatch?
介紹
CountDownLatch是一個計數器,通過它可以控制線程執行的先后順序。它的作用是讓某個線程等待若干個其他線程執行完后再執行。使用CountDownLatch時需要指定一個計數器的值,當所有計數器都為0時,等待線程才會繼續執行。
代碼?
public class TestCountDown {private static CountDownLatch cl=new CountDownLatch(4);public static void main(String[] args) {Thread thread1 = new Thread(() -> {try {System.out.println("start1");Thread.sleep(4000);cl.countDown();System.out.println("end1");} catch (InterruptedException e) {throw new RuntimeException(e);}});Thread thread2 = new Thread(() -> {try {System.out.println("start2");Thread.sleep(4000);cl.countDown();System.out.println("end2");} catch (InterruptedException e) {throw new RuntimeException(e);}});Thread thread3 = new Thread(() -> {try {System.out.println("start3");Thread.sleep(4000);cl.countDown();System.out.println("end3");} catch (InterruptedException e) {throw new RuntimeException(e);}});Thread thread4 = new Thread(() -> {try {System.out.println("start4");Thread.sleep(4000);cl.countDown();System.out.println("end4");} catch (InterruptedException e) {throw new RuntimeException(e);}});thread1.start();thread2.start();thread3.start();thread4.start();try {cl.await();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("ok");}
}
運行結果
?CyclicBarrier
?介紹
CyclicBarrier也可以用于控制線程的順序執行。它可以協調一組線程在某個屏障處等待并互相等待,直到所有線程都到達該屏障后再一起繼續執行。CyclicBarrier可以重復使用,每次調用await()方法時,計數器的值都會減1,當計數器為0時,所有線程都會被釋放。
代碼?
public class TestCyclicBarrier {// 自定義工作線程private static class Worker extends Thread {private CyclicBarrier cyclicBarrier;public Worker(CyclicBarrier cyclicBarrier) {this.cyclicBarrier = cyclicBarrier;}@Overridepublic void run() {super.run();try {System.out.println(Thread.currentThread().getName() + "開始等待其他線程");cyclicBarrier.await();System.out.println(Thread.currentThread().getName() + "開始執行");// 工作線程開始處理,這里用Thread.sleep()來模擬業務處理Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + "執行完畢");} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {int threadCount = 3;CyclicBarrier cyclicBarrier = new CyclicBarrier(threadCount);for (int i = 0; i < threadCount; i++) {System.out.println("創建工作線程" + i);Worker worker = new Worker(cyclicBarrier);worker.start();}}
}
運行結果
總結?
總結來說,CountDownLatch是控制一個線程等待多個其他線程執行完畢后再執行,而CyclicBarrier是控制多個線程相互等待,直到所有線程都到達某個屏障后再一起繼續執行。?