相關(guān)免費學(xué)習(xí)推薦:java基礎(chǔ)教程
常用的輔助類
- 1.CountDownLatch
- 1.2.示例:班長鎖門問題
- 1.2.CountDownLatch類簡介:
- 1.2.1 CountDownLatch概念
- 1.2.3 CountDownLatch的用法
- 1.3.CountDownLatch案例:
- 1.4.原理總結(jié)
- 2.CyclicBarrier
- 2.1.CyclicBarrier簡介
- 2.2.案例:集齊7顆龍珠召喚神龍
- 3.Semophore
- 3.1.Semophore簡介
- 3.2.搶車位問題
- 3.3.原理總結(jié)
1.CountDownLatch
1.2.示例:班長鎖門問題
問題描述:假如有7個同學(xué)晚上上自習(xí),鑰匙在班長手上,并且要負(fù)責(zé)鎖門。班長必須要等所有人都走光了,班長才能關(guān)燈鎖門。這6個同學(xué)的順序是無序的,不知道它們是何時離開。6個同學(xué)各上各的自習(xí),中間沒有交互。假如說6個學(xué)生是普通線程,班長是主線程,如何讓主線程要等一堆線程運行完了,主線程才能運行完成呢。
public?class?CountDownLatchDemo?{ public?static?void?main(String[]?args)?{ //?TODO?Auto-generated?method?stub for(int?i=1;i<=6;i++){ new Thread(()->{ System.out.println(Thread.currentThread().getName()+"\t離開教室"); },String.valueOf(i)).start(); } System.out.println(Thread.currentThread().getName()+"\t班長關(guān)門走人"); }}
運行結(jié)果截圖
最后還有三個人被鎖在教師了,這樣可能會發(fā)生事故,所以肯定不行的。
我們要想實現(xiàn)這樣的效果,就是等其它線程全部走完了,主線程才能運行。就需要借助JUC中的CountDownLatch類
1.2.CountDownLatch類簡介:
1.2.1 CountDownLatch概念
CountDownLatch是一個同步工具類,用來協(xié)調(diào)多個線程之間的同步,或者說起到線程之間的通信(而不是用作互斥的作用)。
CountDownLatch能夠使一個線程在等待另外一些線程完成各自工作之后,再繼續(xù)執(zhí)行。使用一個計數(shù)器進(jìn)行實現(xiàn)。計數(shù)器初始值為線程的數(shù)量。當(dāng)每一個線程完成自己任務(wù)后,計數(shù)器的值就會減一。當(dāng)計數(shù)器的值為0時,表示所有的線程都已經(jīng)完成一些任務(wù),然后在CountDownLatch上等待的線程就可以恢復(fù)執(zhí)行接下來的任務(wù)。
CountDownLatch說明:count計數(shù),down倒計算,Latch開始
1.2.3 CountDownLatch的用法
某一線程在開始運行前等待n個線程執(zhí)行完畢。將CountDownLatch的計數(shù)器初始化為new CountDownLatch(n),每當(dāng)一個任務(wù)線程執(zhí)行完畢,就將計數(shù)器減1 countdownLatch.countDown(),當(dāng)計數(shù)器的值變?yōu)?時,在CountDownLatch上await()的線程就會被喚醒。一個典型應(yīng)用場景就是啟動一個服務(wù)時,主線程需要等待多個組件加載完畢,之后再繼續(xù)執(zhí)行。
CountDownLatch底層構(gòu)造函數(shù)源代碼
public?CountDownLatch(int?count)?{ ????????if?(count?<?0)?throw?new?IllegalArgumentException("count?<?0"); ????????this.sync?=?new?Sync(count); ????}
1.3.CountDownLatch案例:
public?static?void?main(String[]?args)?throws?InterruptedException?{ //6個同學(xué)正在上自習(xí),每個人就有一個1計數(shù)器,走1個數(shù)字減1,main線程啟動,必須要等計時器從6變成0,才能開始。 CountDownLatch?countDownLatch=new?CountDownLatch(6); for(int?i=1;i<=6;i++){ new Thread(()->{ System.out.println(Thread.currentThread().getName()+"\t離開教室"); countDownLatch.countDown(); //計算減少一個 },String.valueOf(i)).start(); } countDownLatch.await(); //班長前面需要被阻塞 System.out.println(Thread.currentThread().getName()+"\t班長關(guān)門走人"); }
運行結(jié)果截圖
這里每個人何時走并不知道, 但是可以保證每次都是班長最后一個走。
1.4.原理總結(jié)
CountDownLatch主要有兩個方法,當(dāng)一個或多個線程調(diào)用await方法時,這些線程會被阻塞。
其它線程調(diào)用countDown方法將會使計數(shù)器減1(調(diào)用countDown方法的線程不會阻塞)
當(dāng)計數(shù)器的值變?yōu)?時,因await方法阻塞的線程會被喚醒,繼續(xù)執(zhí)行。
2.CyclicBarrier
2.1.CyclicBarrier簡介
cyclic循環(huán),barrier屏障。
從字面上的意思可以知道,這個類的中文意思是“循環(huán)柵欄”。大概的意思就是一個可循環(huán)利用的屏障。
它的作用就是會讓所有線程都等待完成后才會繼續(xù)下一步行動。
上面班長關(guān)門的例子是做倒計時,這里是反過來,做加法,數(shù)到多少就開始。
比如人到齊了,再開會。,舉個例子,就像生活中我們會約同事一起去開會,有些同事可能會早到,有些同事可能會晚到,但是這個會議規(guī)定必須等到所有人到齊之后才會讓我們正式開會。這里的同事們就是各個線程,會議就是 CyclicBarrier。
構(gòu)造方法
public?CyclicBarrier(int?parties)public?CyclicBarrier(int?parties,?Runnable?barrierAction)
解析:
parties 是參與線程的個數(shù)
第二個構(gòu)造方法有一個 Runnable 參數(shù),這個參數(shù)的意思是最后一個到達(dá)線程要做的任務(wù)
我們通常用第二個構(gòu)造函數(shù)。
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<=7;i++){ final int tempInt=i; new Thread(()->{ 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簡介
前面討論的問題都是多對一的問題,我們現(xiàn)在可以討論多對多的問題了。
假設(shè)有7個兄弟開車上班,而現(xiàn)在只有4個車位。7部車并列開進(jìn)4個車位,每個車停了多長時間未知,資源被占用完了。假設(shè)有一個車只停了2s,那么它走了,外面的車又可以進(jìn)來了。走一個進(jìn)一個,最后全部都可以進(jìn)去。而semophore就是控制多線程的并發(fā)策略。
簡單理解來說,Semaphore:信號量主要用于兩個目的:一個是用于多個共享資源的互斥使用;另一個用于并發(fā)線程數(shù)量的控制。
Semaphore類有兩個重要方法
1、semaphore.acquire();
請求一個信號量,這時候信號量個數(shù)-1,當(dāng)減少到0的時候,下一次acquire不會再執(zhí)行,只有當(dāng)執(zhí)行一個release()的時候,信號量不為0的時候才可以繼續(xù)執(zhí)行acquire
2、semaphore.release();
釋放一個信號量,這時候信號量個數(shù)+1,
3.2.搶車位問題
public?static?void?main(String[]?args)?{ //模擬6部車搶3個空車位 Semaphore?semaphore=new?Semaphore(3);//模擬資源類,有3個空車位 for(int?i=1;i<=6;i++){ new Thread(()->{ try?{ //誰先搶到了,誰就占一個車位,并且要把semaphore中的資源數(shù)減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(); } }
運行結(jié)果截圖:
3.3.原理總結(jié)
在信號量上我們定義兩種操作:
acquire(獲取)當(dāng)一個線程調(diào)用acquire操作時,它要么通過成功獲取信號量(信號量減1),要么一直等待下去,直到有線程釋放信號量,或超時。
release(釋放)實際上會將信號量的值加1,然后喚醒等待的線程。
信號量主要用于兩個目的:一個是用于多個共享資源的互斥使用;另一個用于并發(fā)線程數(shù)量的控制
如果把資源數(shù)從3變成1了,此時就等價于synchronized。
Atas ialah kandungan terperinci Java并發(fā)編程,介紹常用的輔助類. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk mengendalikan akses serentak dalam pembangunan fungsi backend Java? Dalam aplikasi Internet moden, capaian serentak yang tinggi adalah cabaran biasa. Apabila berbilang pengguna mengakses perkhidmatan bahagian belakang pada masa yang sama, jika konkurensi tidak dikendalikan dengan betul, ia boleh membawa kepada isu seperti ketekalan data, prestasi dan keselamatan. Artikel ini akan memperkenalkan beberapa amalan terbaik untuk mengendalikan akses serentak dalam pembangunan backend Java. 1. Gunakan penyegerakan benang Java menyediakan pelbagai mekanisme untuk mengendalikan akses serentak, yang paling biasa digunakan ialah penyegerakan benang. Dengan menambahkan penyegerakan sebelum blok atau kaedah kod utama

Jawapan: Mekanisme refleksi membolehkan program Java untuk memeriksa dan mengubah suai kelas dan objek pada masa jalan melalui API pantulan, yang boleh digunakan untuk melaksanakan mekanisme penyelarasan fleksibel dalam penyelarasan Java. Aplikasi: Buat benang secara dinamik. Tukar keutamaan benang secara dinamik. Suntikan kebergantungan.

Bagaimana untuk membuat tugasan selari menggunakan rangka kerja Fork/Join di Java? Tentukan logik tugasan, kira keputusan atau lakukan tindakan. Cipta ForkJoinPool untuk mengurus benang selari. Gunakan kaedah fork() untuk menyerahkan tugas. Gunakan kaedah join() untuk mendapatkan hasil tugasan.

Bagaimana untuk menyelesaikan: Ralat Java Concurrency: Deadlock Detection Deadlock ialah masalah biasa dalam pengaturcaraan berbilang benang. Kebuntuan berlaku apabila dua atau lebih utas menunggu antara satu sama lain untuk melepaskan sumber terkunci. Kebuntuan akan menyebabkan utas disekat, sumber tidak boleh dikeluarkan, dan program tidak dapat terus dilaksanakan, mengakibatkan kegagalan sistem. Untuk menyelesaikan masalah ini, Java menyediakan mekanisme pengesanan kebuntuan. Pengesanan jalan buntu menentukan sama ada terdapat jalan buntu dengan menyemak kebergantungan antara utas dan situasi beratur aplikasi sumber Setelah kebuntuan ditemui, sistem boleh mengambil langkah yang sepadan.

Baris Gilir Menyekat: Alat Berkuasa untuk Baris Gilir Penyekatan dan Berbilang Benang ialah baris gilir selamat benang yang memainkan peranan penting berikut dalam pengaturcaraan serentak dan berbilang benang: Penyegerakan Benang: Mencegah keadaan perlumbaan dan ketidakkonsistenan data dengan menyekat operasi. Penampan data: Sebagai penimbal data, ia mengurangkan masalah ketidakpadanan dalam kelajuan benang pengeluar dan pengguna. Pengimbangan beban: Kawal bilangan elemen dalam baris gilir dan imbangi beban pengeluar dan pengguna.

Cara-cara untuk Menyelesaikan Ralat dan Pengecualian Keadaan Perlumbaan Java Concurrency merujuk kepada apabila berbilang rangkaian mengakses dan mengubah suai sumber yang dikongsi pada masa yang sama, dan ketepatan keputusan akhir dipengaruhi oleh susunan pelaksanaan. Di Java, apabila berbilang benang mengakses sumber yang dikongsi secara serentak, ralat keadaan perlumbaan akan berlaku jika mekanisme penyegerakan tidak digunakan dengan betul. Apabila ralat keadaan perlumbaan berlaku, program mungkin menghasilkan keputusan yang tidak dijangka atau malah ranap. Artikel ini akan membincangkan cara menyelesaikan pengecualian ralat keadaan perlumbaan serentak Java. 1. Cara paling biasa untuk menyelesaikan keadaan perlumbaan menggunakan mekanisme penyegerakan

Bagaimana untuk menyelesaikan: Ralat Java Concurrency: Kebuntuan Benang Pengenalan: Kebuntuan benang adalah masalah yang sangat biasa dalam pengaturcaraan serentak. Apabila beberapa utas bersaing untuk mendapatkan sumber, kebuntuan mungkin berlaku jika utas menunggu antara satu sama lain untuk mengeluarkan sumber. Artikel ini akan memperkenalkan konsep kebuntuan benang, puncanya, dan cara menyelesaikan masalah ini. Konsep kebuntuan benang berlaku apabila berbilang benang menunggu antara satu sama lain untuk melepaskan sumber, menyebabkan semua benang tidak dapat meneruskan pelaksanaan, membentuk kebuntuan benang. Kebuntuan benang biasanya berlaku kerana empat keadaan berikut adalah benar pada masa yang sama

Kedua-dua CountDownLatch dan CyclicBarrier digunakan dalam persekitaran berbilang benang, dan kedua-duanya adalah sebahagian daripada persekitaran berbilang benang. Menurut JavaDoc - CountDownLatch - Bantuan penyegerakan yang membenarkan satu atau lebih utas menunggu sehingga satu set operasi yang dilakukan dalam utas lain selesai. CyclicBarrier - Bantuan penyegerakan yang membolehkan sekumpulan benang menunggu antara satu sama lain untuk mencapai titik halangan yang sama. tuan-tuan. KeyCyclicBarrierCountDownLatch1 pada asasnya membenarkan sekumpulan utas dibantu serentak semua menunggu antara satu sama lain untuk mencapai titik halangan yang sama. Bantuan penyegerakan yang membolehkan satu atau lebih utas menunggu untuk satu set operasi dilakukan dalam utas lain.
