搜尋
首頁JavaJava基礎Java並發編程,介紹常用的輔助類

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班长关门走人");
	}}

運行結果截圖
Java並發編程,介紹常用的輔助類
最後還有三個人被鎖在教師了,這樣可能會發生事故,所以肯定不行的。

我們要想實現這樣的效果,就是等其它執行緒全部走完了,主執行緒才能運作。就需要藉助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班长关门走人");
	}
執行結果截圖


Java並發編程,介紹常用的輔助類 這裡每個人何時走並不知道, 但是可以保證每次都是班長最後一個走。

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();;
		}
	}

截图
Java並發編程,介紹常用的輔助類

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();
		}
	}

运行结果截图:
Java並發編程,介紹常用的輔助類

3.3.原理总结

在信号量上我们定义两种操作:

acquire(获取)当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等待下去,直到有线程释放信号量,或超时。

release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。

信号量主要用于两个目的:一个是用于多个共享资源的互斥使用;另一个用于并发线程数量的控制

如果把资源数从3变成1了,此时就等价于synchronized。

以上是Java並發編程,介紹常用的輔助類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
Java中有哪些不同的垃圾收集算法(串行,並行,CMS,G1,ZGC)?Java中有哪些不同的垃圾收集算法(串行,並行,CMS,G1,ZGC)?Mar 14, 2025 pm 05:06 PM

本文討論了各種Java垃圾收集算法(串行,並行,CMS,G1,ZGC),它們的性能影響和適合大量堆的應用。

什麼是Java虛擬機(JVM),它在內部如何工作?什麼是Java虛擬機(JVM),它在內部如何工作?Mar 14, 2025 pm 05:05 PM

本文討論了Java虛擬機(JVM),詳細介紹了其在不同平台運行Java程序中的作用。它說明了JVM的內部流程,密鑰組件,內存管理,垃圾收集和性能Optimizatio

如何使用Java的Nashorn Engine用JavaScript腳本?如何使用Java的Nashorn Engine用JavaScript腳本?Mar 14, 2025 pm 05:00 PM

Java的Nashorn Engine可以在Java應用程序中啟用JavaScript腳本。關鍵步驟包括設置Nashorn,管理腳本和優化性能。主要問題涉及安全性,內存管理和未來兼容性

如何使用Java的Try-with-Resources語句進行自動資源管理?如何使用Java的Try-with-Resources語句進行自動資源管理?Mar 14, 2025 pm 04:59 PM

Java的Try-with-Resources通過自動關閉文件流或數據庫連接等資源來簡化資源管理,從而提高代碼可讀性和可維護性。

如何使用Java的枚舉來表示固定的值集?如何使用Java的枚舉來表示固定的值集?Mar 14, 2025 pm 04:57 PM

Java枚舉代表固定的值集,通過自定義方法和構造函數提供類型安全性,可讀性和其他功能。它們增強了代碼組織,可用於開關語句中以進行有效的價值處理。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具