Java並發編程,介紹常用的輔助類
相關免費學習推薦:java基礎教學
常用的輔助類別
- 1.CountDownLatch
- 1.2.範例:班長鎖門問題
- 1.2. CountDownLatch類別簡介:
- 1.2.1 CountDownLatch概念
- 1.2.3 CountDownLatch的用法
- #1.3.CountDownLatch案例:
- 1.4.原理總結
- 2.CyclicBarrier
- 2.1.CyclicBarrier簡介
- 2.2.案例:集齊7顆龍珠召喚神龍
- 3.Semophore
- 3.1.Semophore簡介
- 3.2.搶車位問題
- 3.3.原理總結
1.CountDownLatch
1.2.範例:班長鎖門問題
問題描述:假如有7個同學晚上上自習,鑰匙在班長手上,並且要負責鎖門。班長必須等所有人都走光了,班長才能關燈鎖門。這6個同學的順序是無序的,不知道它們是何時離開。 6個同學各上各的自習,中間沒有互動。假如說6個學生是普通線程,班長是主線程,如何讓主線程要等一堆線程運行完了,主線程才能運行完成。
public class CountDownLatchDemo { public static void main(String[] args) { // TODO Auto-generated method stub for(int i=1;i{ System.out.println(Thread.currentThread().getName()+"\t离开教室"); },String.valueOf(i)).start(); } System.out.println(Thread.currentThread().getName()+"\t班长关门走人"); }}
運行結果截圖
最後還有三個人被鎖在教師了,這樣可能會發生事故,所以肯定不行的。
我們要想實現這樣的效果,就是等其它執行緒全部走完了,主執行緒才能運作。就需要藉助JUC中的CountDownLatch類別
1.2.CountDownLatch類別簡介:
1.2.1 CountDownLatch概念
#CountDownLatch是一個同步工具類,用來協調多個執行緒之間的同步,或者說起到執行緒之間的通訊(而不是用作互斥的作用)。
CountDownLatch能夠讓一個執行緒在等待另外一些執行緒完成各自工作之後,然後再繼續執行。 使用一個計數器進行實作。計數器初始值為執行緒的數量。當每一個執行緒完成自己任務後,計數器的值就會減一。當計數器的值為0時,表示所有的執行緒都已經完成一些任務,然後在CountDownLatch上等待的執行緒就可以恢復執行接下來的任務。
CountDownLatch說明:count計數,down倒計算,Latch開始
#1.2.3 CountDownLatch的用法
##某一執行緒在開始運行前等待n個執行緒執行完畢。將CountDownLatch的計數器初始化為new CountDownLatch(n),每當一個任務執行緒執行完畢,就將計數器減1 countdownLatch.countDown(),當計數器的值變成0時,在CountDownLatch上await()的執行緒就會被喚醒。一個典型應用場景就是啟動一個服務時,主執行緒需要等待多個元件載入完畢,然後再繼續執行。 CountDownLatch底層建構子原始碼
public CountDownLatch(int count) { if (count <p>1.3.CountDownLatch案例:<strong></strong></p><pre class="brush:php;toolbar:false">public static void main(String[] args) throws InterruptedException { //6个同学正在上自习,每个人就有一个1计数器,走1个数字减1,main线程启动,必须要等计时器从6变成0,才能开始。 CountDownLatch countDownLatch=new CountDownLatch(6); for(int i=1;i{ System.out.println(Thread.currentThread().getName()+"\t离开教室"); countDownLatch.countDown(); //计算减少一个 },String.valueOf(i)).start(); } countDownLatch.await(); //班长前面需要被阻塞 System.out.println(Thread.currentThread().getName()+"\t班长关门走人"); }
這裡每個人何時走並不知道, 但是可以保證每次都是班長最後一個走。
1.4.原理總結
CountDownLatch主要有兩個方法,當一個或多個執行緒呼叫await方法時,這些執行緒會被阻塞。 其它執行緒呼叫countDown方法將會使計數器減1(呼叫countDown方法的執行緒不會阻塞)
當計數器的值變成0時,因await方法阻塞的執行緒會被喚醒,繼續執行。
2.CyclicBarrier
2.1.CyclicBarrier簡介
cyclic循環,barrier屏障。 從字面上的意思可以知道,這個類別的中文意思是「循環柵欄」。大概的意思就是一個可循環利用的屏障。
它的作用就是會讓所有執行緒都等待完成後才會繼續下一步行動。 上面班長關門的例子是做倒數計時,這裡是反過來,做加法,數到多少就開始。
例如人到齊了,再開會。 ,舉個例子,就像生活中我們會約同事一起去開會,有些同事可能會早到,有些同事可能會晚到,但是這個會議規定必須等到所有人到齊之後才會讓我們正式開會。這裡的同事就是各個線程,會議就是 CyclicBarrier。
public CyclicBarrier(int parties)public CyclicBarrier(int parties, Runnable barrierAction)
parties 是參與執行緒的數量 第二個建構方法有一個Runnable 參數,這個參數的意思是最後一個到達執行緒要做的任務
2.2.案例:集齊7顆龍珠召喚神龍#
public static void main(String[] args) { // TODO Auto-generated method stub CyclicBarrier cyclicBarrier=new CyclicBarrier(7,()->{System.out.println("召唤神龙");}); for(int i=1;i{ System.out.println(Thread.currentThread().getName()+"\t收集到第"+tempInt+"颗龙珠"); try { //某个线程收集到了龙珠只能先等着,等龙珠收齐了才能召唤神龙 cyclicBarrier.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } },String.valueOf(i)).start();; } }
截图
3.Semophore
3.1.Semophore简介
前面讨论的问题都是多对一的问题,我们现在可以讨论多对多的问题了。
假设有7个兄弟开车上班,而现在只有4个车位。7部车并列开进4个车位,每个车停了多长时间未知,资源被占用完了。假设有一个车只停了2s,那么它走了,外面的车又可以进来了。走一个进一个,最后全部都可以进去。而semophore就是控制多线程的并发策略。
简单理解来说,Semaphore:信号量主要用于两个目的:一个是用于多个共享资源的互斥使用;另一个用于并发线程数量的控制。
Semaphore类有两个重要方法
1、semaphore.acquire();
请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release()的时候,信号量不为0的时候才可以继续执行acquire
2、semaphore.release();
释放一个信号量,这时候信号量个数+1,
3.2.抢车位问题
public static void main(String[] args) { //模拟6部车抢3个空车位 Semaphore semaphore=new Semaphore(3);//模拟资源类,有3个空车位 for(int i=1;i{ try { //谁先抢到了,谁就占一个车位,并且要把semaphore中的资源数减1 semaphore.acquire(); System.out.println(Thread.currentThread().getName()+"\t抢占到了车位"); TimeUnit.SECONDS.sleep(3); System.out.println(Thread.currentThread().getName()+"\t离开了车位"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //释放车位 semaphore.release(); } },String.valueOf(i)).start(); } }
运行结果截图:
3.3.原理总结
在信号量上我们定义两种操作:
acquire(获取)当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等待下去,直到有线程释放信号量,或超时。
release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。
信号量主要用于两个目的:一个是用于多个共享资源的互斥使用;另一个用于并发线程数量的控制
如果把资源数从3变成1了,此时就等价于synchronized。
以上是Java並發編程,介紹常用的輔助類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

如何在Java後端功能開發中處理並發存取?在現代網路應用中,高並發存取是常見的挑戰。當多個使用者同時存取後端服務時,如果不正確處理並發,可能會導致資料一致性、效能和安全性等問題。這篇文章將介紹一些在Java後端開發中處理並發存取的最佳實務。 1.使用執行緒同步Java提供了多種機制來處理並發訪問,其中最常用的是執行緒同步。透過在關鍵程式碼區塊或方法前加入synch

如何在Java中使用Fork/Join框架建立平行任務?定義任務邏輯,計算結果或執行動作。建立ForkJoinPool管理並行執行緒。使用fork()方法提交任務。使用join()方法取得任務結果。

答:反射機制透過反射API允許Java程式在執行時間檢查和修改類別和對象,在Java並發中可用於實現靈活的並發機制。應用:動態創建線程。動態改變執行緒優先權。注入依賴。

如何解決:Java並發錯誤:死鎖偵測在多執行緒程式設計中,死鎖是一個常見的問題。當兩個或多個執行緒互相等待對方釋放鎖資源時,就會發生死鎖。死鎖會導致執行緒被阻塞,資源無法釋放,程式無法繼續執行,進而導致系統故障。為了解決這個問題,Java提供了死鎖偵測機制。死鎖偵測是透過檢查線程之間的依賴關係和資源申請排隊情況來判斷是否存在死鎖的,一旦發現死鎖,系統可以採取相應的

阻塞佇列:並發和多執行緒的強大工具阻塞佇列是一種執行緒安全的佇列,在並發和多執行緒程式設計中發揮以下關鍵作用:執行緒同步:透過阻塞操作,防止爭用條件和資料不一致。資料緩衝:作為資料緩衝區,緩解生產者和消費者執行緒速度不匹配的問題。負載平衡:控制隊列中的元素數量,平衡生產者和消費者的負載。

如何解決:Java並發錯誤:執行緒死鎖簡介:在並發程式設計中,執行緒死鎖是一個非常常見的問題。當多個執行緒在爭奪資源時,若執行緒間發生相互等待對方釋放資源的情況,就可能導致死鎖。本文將介紹線程死鎖的概念、產生原因,以及如何解決這個問題。執行緒死鎖的概念當多個執行緒相互等待對方釋放資源時,導致所有執行緒無法繼續執行下去,形成了執行緒死鎖。執行緒死鎖的發生通常是由於以下四個條件同時成立

解決Java並發競態條件錯誤異常的方法競態條件是指多個執行緒同時存取並修改共享資源時,最終結果的正確性受到執行順序的影響。在Java中,當多個執行緒並發地存取共享資源時,如果沒有正確地使用同步機制,就會出現競態條件錯誤。當發生競態條件錯誤時,程式可能會產生未預期的結果,甚至導致崩潰。本文將討論如何解決Java並發競態條件錯誤異常。一、使用同步機制最常見的解決競態

CountDownLatch和CyclicBarrier都用於多執行緒環境,而且它們都是多執行緒環境的一部分。根據JavaDoc-CountDownLatch-一種允許一個或多個執行緒等待的同步輔助工具直到其他執行緒中執行的一組操作完成。 CyclicBarrier-一種同步輔助工具,允許一組執行緒相互等待到達公共屏障點。先生。編號KeyCyclicBarrierCountDownLatch1基本上允許一組執行緒的同步輔助全部等待彼此到達公共障礙點。一種允許一個或多個線程的同步輔助工具等待其他線程中執行的一組操
