当前位置:网站首页>线程唤醒机制
线程唤醒机制
2022-07-31 05:41:00 【极速小乌龟】
一、wait和notify实现等待和唤醒
要在 synchronized 锁中使用,切先等待才能进行唤醒
Object object = new Object();
Thread t1 = new Thread(() -> {
synchronized (object) {
try {
System.out.println("================进入线程=============");
object.wait();
System.out.println("================线程被唤醒=============");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"t1");
t1.start();
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() ->{
synchronized (object){
object.notify();
System.out.println("进行唤醒==============");
}
},"t2").start();
二、await和signal实现等待和唤醒
需要在lock下使用,配合condition 实现,先等待才能进行唤醒
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
Thread t1 = new Thread(() -> {
lock.lock();
try{
System.out.println("=============进入方法==============");
condition.await();
System.out.println("=================线程被唤醒=================");
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}, "t1");
t1.start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() ->{
lock.lock();
try{
condition.signal();
System.out.println("=============唤醒操作================");
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
},"t2").start();
三、park和unpark实现等待和唤醒
unpark进行许可证的发布:最多只能发布一张许可证(不会累积)。如果一个方法出现两次LockSupport.park();就会出现问题。
基于LockSupport实现,无顺序要求,可以先park也可以先unpark。底层基于UNSAFE类实现
Thread t1 = new Thread(() -> {
System.out.println("===============进入线程执行=====================");
LockSupport.park();
System.out.println("===============线程被唤醒=====================");
}, "t1");
t1.start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() ->{
LockSupport.unpark(t1);
System.out.println("================进行唤醒==================");
},"t2").start();
边栏推荐
猜你喜欢
随机推荐
深度解析 z-index
运行 npm 会弹出询问 “你要如何打开这个文件?“
引导过程和服务控制
MySQL的触发器
postgresql源码学习(33)—— 事务日志⑨ - 从insert记录看日志写入整体流程
MySQL笔记下
12.0 堆参数调优入门之GC收集日志信息
Database Principles Homework 2 — JMU
How to use repeating-linear-gradient
Oracle入门 12 - Linux 磁盘分区及LVM实战
tidyverse笔记——管道函数
Moment.js常用方法
常用命令讲解
Third-party library-store
Oracle入门 10 - Linux 设备类型与文件目录结构
Oracle入门 09 - Linux 文件上传与下载
10.0 堆体系结构概述之元空间/永久代
银河麒麟服务器v10 sp2安装oracle19c
高并发与多线程之间的难点对比(容易混淆)
Dart入门