Condition
类,功能要比 wait/notify
更强一些也称为“信号灯”(开船的水手,旗语)
你去车库停车,如何知道是否还有空位?
现在的停车场,一般的入口处,就会有一个“电子牌”,会显示有多少个空闲车位
这里的“电子牌”就像是一个“信号量”,信号量是一个计数器,通过计数器衡量“可用资源”的个数
操作系统本身提供了信号量实现,JVM 把操作系统的信号量封装了一下,我们直接使用就可以了
import java.util.concurrent.Semaphore;
public class Demo5 {
public static void main(String[] args) throws InterruptedException {
//参数为可用资源的个数,计数器的初始值
Semaphore semaphore = new Semaphore(3);
semaphore.acquire();
System.out.println("申请一个资源1");
semaphore.acquire();
System.out.println("申请一个资源2");
semaphore.acquire();
System.out.println("申请一个资源3");
semaphore.acquire();
System.out.println("申请一个资源4");
}
}
//运行结果
申请一个资源1
申请一个资源2
申请一个资源3
若在这里面释放一次资源,就可以将资源 4 申请进去:
import java.util.concurrent.Semaphore;
public class Demo5 {
public static void main(String[] args) throws InterruptedException {
//参数为可用资源的个数,计数器的初始值
Semaphore semaphore = new Semaphore(3);
semaphore.acquire();
System.out.println("申请一个资源1");
semaphore.acquire();
System.out.println("申请一个资源2");
semaphore.acquire();
System.out.println("申请一个资源3");
semaphore.release();
System.out.println("释放一个资源");
semaphore.acquire();
System.out.println("申请一个资源4");
}
}
//运行结果
申请一个资源1
申请一个资源2
申请一个资源3
释放一个资源
申请一个资源4
“锁存器”
很多时候,需要把一个大的任务,拆成多个小的任务,通过多线程/线程池来执行。如何衡量,所有的任务都执行完毕了?
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Demo6 {
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(4);
//构造方法的个数,就是拆分出来的任务数量
CountDownLatch countDownLatch = new CountDownLatch(20);
for (int i = 0; i < 20; i++) {
int id = i;
executorService.submit(() -> {
System.out.println("下载任务" + id + "开始执行");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("下载任务" + id + "结束执行");
//完毕 over!
countDownLatch.countDown();
});
}
// 当 countDownLatch 收到了 20 个“完成”,所有的任务就都完成了
// await => all wait
// await 这个词是计算机术语,“等待所有”
countDownLatch.await();
System.out.println("所有任务都完成");
}
}
CountDownLatch
一般都是结合线程池进行使用CountDownLatch
就能衡量出当前任务是否整体执行结束上面这些再实际开发中用的布套多,但面试可能问到,特别是“ReentrantLock”和“Semaphore”
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。