8. Classes auxiliares comumente usadas
1.CountDownLatch contador de subtração
package com.xizi.assistClass;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i = 1; i <= 6; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+" Go Out");
countDownLatch.countDown();//数量减一
},String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println("close Door");
}
}
countDownLatch.ccountDown () count-1
countDownLatch.await (); // Espere o contador zerar e então execute para baixo
O número de chamadas countDown () -1 de cada vez
Supondo que o contador se torne 0, countDownLatch.await () será ativado para continuar a execução
2. Contador de adição CyclicBarrier
package com.xizi.assistClass;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
public static void main(String[] args) {
// 集齐7颗龙珠召唤神龙
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
System.out.println("召唤神龙成功!");
});
for (int i = 1; i <= 7; i++) {
final int temp=i;
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"收集"+temp+"龙珠");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
3. Semáforo semáforo
package com.xizi.assistClass;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class SemaphoreDemo {
public static void main(String[] args) {
//线程数量。停车位
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i <= 6; i++) {
new Thread(()->{
//acquire()得到
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();//释放
}
},String.valueOf(i)).start();
}
}
}
adquirir (); Se a hipótese de aquisição estiver completa, espere até que seja liberada
release (); release, irá liberar o sinal atual +1 e, em seguida, despertará o thread em espera
Função: Vários recursos compartilhados são mutuamente exclusivos! Limite de corrente simultânea, controle o número máximo de threads!