JUC下的常用辅助类
1.1、ConutDownLancuh
一、ConutDownLancuh介绍
ConutDownLancuh是一个用于计数的线程类,类似倒计时,当然单单计数肯定是没意义的,所以还要搭配一个方法,下面介绍
二、使用
主要的两个方法:
- CountDownLatch对象的
countDown()
方法:计数减一 - CountDownLatch对象的
await()
方法- 当计数线程不为0时,将一直等待下去,直到被唤醒
package com.migu;
import java.util.concurrent.*;
/**
* 实现一个当所有线程都执行完毕时,再下一步的场景
*/
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CountDownLatch count = new CountDownLatch(5); // 创建一个总共计数5次的线程
for (int i = 1; i <= 5; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName() + "go out");
count.countDown(); // 减 1
},String.valueOf(i)).start();
}
count.await();
System.out.println("完毕");
}
}
输出:
1.2、CyclicBarrier
一、CyclicBarrier介绍
CyclicBarrier也是可以指定Count
并对其计数的线程,并且还可以自己创建一个线程
二、使用
主要两个方法:
- CyclicBarrier:存在两个构造器,有一个构造器可以创建一个线程
- CyclicBarrier对象的
await()
方法- 每等待一次,都会对
count
减一,当为0
时,执行内部携带的任务,并重新对count
初始化
- 每等待一次,都会对
package com.migu;
import java.util.concurrent.*;
/**
* 实现一个当所有线程都执行完毕时,再下一步的场景
*/
public class Test {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(7, () -> {
System.out.println("召唤神龙");
});
for (int i = 1; i <= 6; i++) {
final int temp = i; // 按照我目前的理解是,JDK1.8常量池存放堆中,是线程共享的
new Thread(()->{
System.out.println(Thread.currentThread().getName() + ": 第" + temp + "龙珠");
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}
1.3、SemaPhore
一、SemaPhore介绍
SemaPhore依然位于java.util.concurrent
包下
- 表示一个信号量类,信号量是操作系统的一个专业术语,我在前面提到过
- 说白了就是可以设置多把锁,支持限定数量的线程同时执行
二、使用
Semaphore构造器实现主要用于指定信号量
- 空惨构造函数,默认的锁采用的是非公平锁
- 获取锁的方法:
acquire()
- 释放锁的方法:
release()
package com.migu;
import java.util.concurrent.*;
/**
* 实现一个可以同时执行 n个数量的线程场景
*/
public class Test {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(2); // 只有两把锁
for (int i = 1; i <= 4; i++) {
final int temp = i;
new Thread(()->{
try {
semaphore.acquire(); // 拿到了锁才能进入以下代码
System.out.println(Thread.currentThread().getName() + "抢到了: " + temp + "车位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 释放锁
System.out.println(Thread.currentThread().getName() + "离开: " + temp + "车位");
}
},String.valueOf(i)).start();
}
}
}