Java多线程(3):wait()/notify()实例
2024-08-31 00:05:40
下面是代码实例
public class WaitDemo implements Runnable { private Object lock; public WaitDemo(Object lock) {
this.lock = lock;
} @Override
public void run() {
synchronized (lock) {
System.out.println("Begin wait() ThreadName=" + Thread.currentThread().getName());
try {
// [STEP-1] WaitDemo线程立刻释放获得的对象锁lock,并放弃CPU,进入等待队列。
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
// [STEP-4] WaitDemo有机会获得另一个线程释放的锁,并从等待的地方起开始执行。
System.out.println("End wait() ThreadName=" + Thread.currentThread().getName());
}
}
}
public class NotifyDemo implements Runnable { private Object lock; public NotifyDemo(Object lock) {
this.lock = lock;
} @Override
public void run() {
synchronized (lock) {
System.out.println("Begin notify() ThreadName=" + Thread.currentThread().getName());
// [STEP-2] NotifyDemo线程唤醒其他挂起的线程(WaitDemo线程)。但是此时它并不立即释放锁。
lock.notify();
try {
System.out.println("Sleep 3s...");
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End notify() ThreadName=" + Thread.currentThread().getName());
// [STEP-3] 释放锁。
}
}
}
// 该实例无法保证假设在线程WaitDemo和NotifyDemo的先后执行顺序。如果线程B先执行了notify()然后结束了,线程A才去执行wait(),那此时,线程A将无法被正常唤醒了
public class DemoTest { public static void main(String[] args) throws InterruptedException {
Object o = new Object();
// WaitDemo
Thread a = new Thread(new WaitDemo(o));
a.setName("WaitDemo");
a.start();
Thread.sleep(2000);
// NotifyDemo
Thread b = new Thread(new NotifyDemo(o));
b.setName("NotifyDemo");
b.start();
}
}
最新文章
- /proc/sys/vm/参数
- 获取下拉框的value和值
- MATLAB中取整函数(fix, floor, ceil, round)的使用
- oracle检查点队列(checkpoint queue)
- 实现关闭窗口IE不提示兼容火狐
- post 的body json要使用双引号,而不是单引号
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
- 【JavaScript】谈谈Google Polymer以及Web UI框架的未来
- ASP获取json天气信息
- Maven使用第三方jar文件的两种方法 转
- document.body.clientWidth vs document.documentElement.clientWidth
- 001.web前端-学习了解
- BCP导入导出MsSql
- Github+Hexo,搭建专有博客
- Python随笔,day1
- NOIP2011题解
- [python] PyMouse、PyKeyboard用python操作鼠标和键盘
- intellij 操作
- lumen 5.6 设置APP_KEY为32位长的随机字符串
- (转)C# System.Diagnostics.Process.Start使用