常用的輔助類
CountDownLatch
這是一個(gè)JUC計(jì)數(shù)器輔助類,計(jì)數(shù)器有加有減,這是減。
使用方法
package org.example.demo;
import java.util.concurrent.CountDownLatch;
//線程計(jì)數(shù)器
public class CountDownLatchDemo {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(6);//總數(shù)為6,必須要執(zhí)行任務(wù)時(shí)用
for (int i = 0; i < 6; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+" go out");
countDownLatch.countDown();//總數(shù)減1
},String.valueOf(i)).start();
}
try {
countDownLatch.await();//等待總數(shù)變?yōu)?才會(huì)往下執(zhí)行,相當(dāng)于阻塞當(dāng)前線程
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("關(guān)門");
}
}
使用前
可能會(huì)在所有人沒出去之前關(guān)門
使用后
不在乎誰先出去,但是一定要總數(shù)等于0后才會(huì)關(guān)門
原理
countDownLatch.countDown();//總數(shù)減1
countDownLatch.await();//等待總數(shù)變?yōu)?才會(huì)往下執(zhí)行,相當(dāng)于阻塞當(dāng)前線程
每次有線程調(diào)用countDown() 數(shù)量減一,假設(shè)計(jì)數(shù)器變?yōu)?,await()就會(huì)被喚醒,繼續(xù)執(zhí)行!
CyclicBarrier
有減法就有加法
使用方法略有不同,一是添加了達(dá)到數(shù)量后可以執(zhí)行一個(gè)方法,二十a(chǎn)wait方法放在了線程的內(nèi)部
package org.example.demo;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("召喚神龍成功");//在達(dá)到數(shù)量后運(yùn)行一個(gè)Runnable接口方法
});
for (int i = 1; i <= 7; i++) {
//lambda表達(dá)式本質(zhì)上還是new了一個(gè)類,所以無法直接拿到for循環(huán)中的變量i,需要通過一個(gè)臨時(shí)變量final來作為一個(gè)中間變量來獲取到i
final int temp = i;
new Thread(()->{
System.out.println(Thread.currentThread().getName()+":獲取到了"+temp+"顆龍珠");
try {
cyclicBarrier.await();//每次等待完成后往下執(zhí)行,如果達(dá)不到數(shù)量會(huì)死在這
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (BrokenBarrierException e) {
throw new RuntimeException(e);
}
},String.valueOf(i)).start();
}
}
}
Semaphore
Semaphore:信號(hào)量
搶車位:6輛車3個(gè)車位,123占據(jù)了那么456就需要等待,當(dāng)占據(jù)的車走后,那么等待的車就要進(jìn)入該車位。
用于限流等操作
package org.example.demo;
import java.sql.Time;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class SemaphoreDemo {
public static void main(String[] args) {
// 線程數(shù)量:限流!讓沒有得到的等待釋放
Semaphore sim = new Semaphore(3);
for (int i = 0; i < 6; i++) {
new Thread(()->{
//acquire 得到
//release 釋放
try {
sim.acquire();
System.out.println(Thread.currentThread().getName()+":搶到車位");
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName()+":離開車位");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}finally {//所有需要關(guān)閉、釋放的操作都放在finally中
sim.release();
}
}).start();
}
}
}
sim.acquire();//得到
sim.release();//釋放文章來源:http://www.zghlxwxcb.cn/news/detail-741787.html
作用:多個(gè)共享資源互斥的使用!并發(fā)限流,控制最大線程數(shù)!文章來源地址http://www.zghlxwxcb.cn/news/detail-741787.html
到了這里,關(guān)于JUC并發(fā)編程學(xué)習(xí)筆記(七)常用的輔助類的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!