三種常用的輔助工具類
阿新 • • 發佈:2022-04-17
CountDownLatch
-
是一個執行減法操作的輔助計數器
//計數器
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
//總數是六,必須在執行任務時再使用
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i = 0; i <=6 ; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+" 開門");
countDownLatch.countDown(); //執行-1操作
},String.valueOf(i)).start();
}
countDownLatch.await();//等待計數器歸零,再執行向下操作
System.out.println("關門");
}
}
CyclicBarrier
//加法計數器
public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(6,()->{
System.out.println("執行緒執行完畢");
});
for (int i = 0; i <=6 ; i++) {
final int temp=i;
new Thread(()->{ //lambda表示式不能直接獲取for迴圈中的變數,需要通過final型別轉換
System.out.println(Thread.currentThread().getName()+"執行緒執行了"+temp);
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}
Semaphore
//執行許可
public class SemaphoreTest {
public static void main(String[] args) {
//執行緒數量:抽象的看成停車位
Semaphore semaphore = new Semaphore(3); //相當於存在三個停車位
for (int i = 0; i <=6 ; i++) {
new Thread(()->{
try {
semaphore.acquire();//獲得,假設執行緒已滿,會等待其他執行緒被釋放為止
System.out.println(Thread.currentThread().getName()+"搶到了車位");
TimeUnit.SECONDS.sleep(2);//執行緒休眠兩秒
System.out.println(Thread.currentThread().getName()+"離開了車位");
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
semaphore.release(); //釋放執行緒,會將當前的釋放量+1,然後喚醒等待
}
},String.valueOf(i)).start();
}
}
}
作用: