并发编程5-同步器
Synchronizer
控制多個線程的流程,比如線程執行到某一個點的時候是等待還是通過。 JDK中自帶了信號量,關卡,閉鎖閉鎖CoutDownLatch
達到最終狀態前是關閉的,所有線程在此阻塞, ?達到最終狀態后開放,并且不可以再修改,所有線程進入可運行狀態。 很適合,等待初始化, 等待依賴等等場景。 如: /*** 設置countDownLatch的初始值,* 用await()來等待* 用countDown來倒計時 --初始值* 當初始值為0時await()等待被notify*/ public class TestLatch {public static void main(String[] args) {final CountDownLatch latch = new CountDownLatch(1);final String[] datas = new String[3];new Thread(){@Overridepublic void run() {try {System.out.println("等待初始化");latch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("初始化完成。開始執行");for (String data : datas) {System.out.println(data);}}}.start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}datas[0] = "我";datas[1] = "愛";datas[2] = "你";System.out.println("初始化完成");latch.countDown();} }信號量?
適用于連接池等場景 /*** 創建一個含有固定許可數的信號量* 線程用acquire()標記獲得了一個許可,切許可-1,當許可為0時等待,* 用release來釋放許可,許可+1,其他等待的線程可以獲得許可了。*/ public class TestSemaphore {public static void main(String[] args) {final Semaphore semaphore = new Semaphore(5);for (int i = 0; i < 20; i++) {new Thread("thread" + i){@Overridepublic void run() {try {semaphore.acquire();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(getName() + "正在執行");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}semaphore.release();;}}.start();}} }關卡
與閉鎖不同的是,閉鎖等待狀態,而關卡是等待線程。 特別適用于把一個計算拆分成多個進行計算,最后再進行整合。 /*** 關卡* 定義所有線程都到關卡之后的行為及關卡中包含的線程數量** 各個線程使用await方法來表示已經到這個關卡等著了** 當指定數目的線程等著了,那么就開放關卡, 所有線程及剛才定義的行為都繼續執行*/ public class TestBarrier {public static void main(String[] args) {final String[] friends = new String[]{"1", "2", "3"};final CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() {@Overridepublic void run() {System.out.println("出發");}});for (final String friend : friends) {new Thread(){@Overridepublic void run() {System.out.println(friend + "到集合點了");try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println(friend + "出發");}}.start();}} }打印如下: 1到集合點了 3到集合點了 2到集合點了 出發 2出發 3出發 1出發
總結
- 上一篇: Windows on Device 项目
- 下一篇: 【吐槽】博客园新的原创文章在搜索引擎的排