LockSupport 挂起和唤醒线程
JDK 的工具类,作用是挂起和唤醒线程。
使用
public class LockSupprtTest {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
System.out.println("t1 begin to park");
LockSupport.park();//t1 挂起自身
System.out.println("t1 unpark");
});
t1.start();
Thread.sleep(1000);
System.out.println("main thread begin unpark t1");
LockSupport.unpark(t1);//main 线程调用 unpark 唤醒挂起的 t1 线程
}
}
t1 begin to park
main thread begin unpark t1
t1 unpark
API
park()
除非有许可,否则禁用当前线程的线程调度。如果许可证可用,则将其消耗掉,并立即返回;否则,当前线程将被禁用,并在以下三种情况之一之前处于休眠:
- 其他线程 unpark 当前线程
- 其他线程 interrupt 当前线程
- 虚假地调用返回。
此方法不报告其中哪一个导致方法返回。调用者应重新检查导致线程首先停滞的条件。调用者还可以确定例如返回时线程的中断状态。
unpark(Thread thread)
唤醒某个线程。
parkNanos(long nanos)
nanos 参数为超时时间
park(Object blocker)
public static void park(Object blocker) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
UNSAFE.park(false, 0L);
setBlocker(t, null);
}
private static void setBlocker(Thread t, Object arg) {
// Even though volatile, hotspot doesn't need a write barrier here.
UNSAFE.putObject(t, parkBlockerOffset, arg);
}
blocker 参数的值实际上赋值给了 parkBlockerOffset 变量。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: CopyOnWriteArrayList 写时复制
下一篇: 谈谈自己对于 AOP 的了解
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论