CountDownLatch的await(long timeout, TimeUnit unit)方法用于让当前线程在指定的时间内等待计数器为0,如果在超时时间内计数器变为0,就继续执行,否则就放弃等待。这个方法有两个参数:
- timeout:表示超时时间的数值,必须是正数。
- unit:表示超时时间的单位,可以是秒、毫秒、微秒、纳秒等。
下面是一个例子,演示了如何使用await(long timeout, TimeUnit unit)方法来实现一个简单的超时检测功能:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class TimeoutDemo {
public static void main(String[] args) throws InterruptedException {
// 创建一个CountDownLatch对象,指定需要等待的线程数量为3
CountDownLatch latch = new CountDownLatch(3);
// 创建三个线程,分别执行不同的任务,其中一个线程故意延迟
Thread t1 = new Thread(() -> {
System.out.println("线程1开始执行");
try {
Thread.sleep(1000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程1执行完毕");
latch.countDown(); // 调用countDown()方法,使计数器减一
});
Thread t2 = new Thread(() -> {
System.out.println("线程2开始执行");
try {
Thread.sleep(2000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程2执行完毕");
latch.countDown(); // 调用countDown()方法,使计数器减一
});
Thread t3 = new Thread(() -> {
System.out.println("线程3开始执行");
try {
Thread.sleep(5000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程3执行完毕");
latch.countDown(); // 调用countDown()方法,使计数器减一
});
// 启动三个线程
t1.start();
t2.start();
t3.start();
// 主线程等待三个线程执行完毕,设置超时时间为3秒
System.out.println("主线程等待三个线程执行完毕,最多等待3秒");
boolean result = latch.await(3, TimeUnit.SECONDS);
System.out.println("主线程继续执行");
System.out.println("等待结果:" + result);
}
}
输出结果:
线程1开始执行
线程2开始执行
线程3开始执行
主线程等待三个线程执行完毕,最多等待3秒
线程1执行完毕
线程2执行完毕
主线程继续执行
等待结果:false
从输出结果可以看出,由于线程3的执行时间超过了主线程的等待时间,所以主线程在等待3秒后就放弃等待,继续执行,返回false表示没有等到所有线程完成。
如果您想了解更多关于await(long timeout, TimeUnit unit)方法的信息,您可以参考以下链接:
- [CountDownLatch的使用和原理解析 - 知乎](^2^)
- [CountDownLatch使用之等待超时 - CSDN博客](^5^)
- [CountDownLatch使用方法以及底层原理 - 知乎](^4^)
希望这些信息对您有所帮助。如果您还有其他问题,欢迎继续与我交流。
😊源: 与必应的对话, 2024/1/4
(1) CountDownLatch的两种常用场景 - 知乎 - 知乎专栏.
https://zhuanlan.zhihu.com/p/148231820.
(2) CountDownLatch使用之等待超时 - CSDN博客.
https://blog.csdn.net/sidongxue2/article/details/71727768.
(3) CountDownLatch使用方法以及底层原理 - 知乎 - 知乎专栏.
https://zhuanlan.zhihu.com/p/646731408.
(4) Java—CountDownLatch使用详解 - Andya_net - 博客园.
https://www.cnblogs.com/Andya/p/12925634.html.
(5) CountDownLatch 的 .await() 的线程阻塞 和countDown() 计时唤醒.
https://blog.csdn.net/u011441473/article/details/103072449.