CountDownLatch 闭锁占有减法计数器
使用前
/**
* 计数器,减法
* @Author Weton Li
* @Date 2021/2/10 16:08
*/
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(6); // 总数是6,必须要执行任务的时候再去使用。
for (int i = 1; i <= 6; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"go out");
// countDownLatch.countDown(); // -1
},String.valueOf(i)).start();
}
// countDownLatch.await(); // 等待计数器归0 再向下执行。指定的count如果没有执行到0,将不会继续向后执行。(无法打印关门)
System.out.println("Close the door");
}
}
使用后
使用CountDownLatch类的countDown()和await()方法后:
/**
* 计数器,减法
* @Author Weton Li
* @Date 2021/2/10 16:08
*/
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(6); // 总数是6,必须要执行任务的时候再去使用。
for (int i = 1; i <= 6; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"go out");
countDownLatch.countDown(); // -1
},String.valueOf(i)).start();
}
countDownLatch.await(); // 等待计数器归0 再向下执行。指定的count如果没有执行到0,将不会继续向后执行。(无法打印关门)
System.out.println("Close the door");
}
}
CyclicBarrier 屏障栅栏加法计数器
使用前
/**
* @Author Weton Li
* @Date 2021/2/10 16:46
*/
public class CyclicBarrierTest {
public static void main(String[] args) {
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(); // 等待以上七个线程执行完,直到parties计数为7
// } catch (InterruptedException e) {
// e.printStackTrace();
// } catch (BrokenBarrierException e) {
// e.printStackTrace();
// }
},String.valueOf(i)).start();
}
}
}
使用后
/**
* @Author Weton Li
* @Date 2021/2/10 16:46
*/
public class CyclicBarrierTest {
public static void main(String[] args) {
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(); // 等待以上七个线程执行完,直到parties计数为7
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}
Semaphore信号量限流
控制最大线程数,保证服务器安全高可用。
/**
* 多个共享资源互斥的使用,并发限流,控制最大线程数。保证服务器安全高可用。
* @Author Weton Li
* @Date 2021/2/10 17:25
*/
public class SemaphoreTest {
public static void main(String[] args) {
// 线程数量:停车位3个,限流3个
Semaphore semaphore = new Semaphore(3); // 停车位
for (int i = 1; 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();// 释放,唤醒等待的线程
}
// 释放
},String.valueOf(i)).start();
}
}
}