下面是代码实例

 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();
}
}

最新文章

  1. /proc/sys/vm/参数
  2. 获取下拉框的value和值
  3. MATLAB中取整函数(fix, floor, ceil, round)的使用
  4. oracle检查点队列(checkpoint queue)
  5. 实现关闭窗口IE不提示兼容火狐
  6. post 的body json要使用双引号,而不是单引号
  7. [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
  8. 【JavaScript】谈谈Google Polymer以及Web UI框架的未来
  9. ASP获取json天气信息
  10. Maven使用第三方jar文件的两种方法 转
  11. document.body.clientWidth vs document.documentElement.clientWidth
  12. 001.web前端-学习了解
  13. BCP导入导出MsSql
  14. Github+Hexo,搭建专有博客
  15. Python随笔,day1
  16. NOIP2011题解
  17. [python] PyMouse、PyKeyboard用python操作鼠标和键盘
  18. intellij 操作
  19. lumen 5.6 设置APP_KEY为32位长的随机字符串
  20. (转)C# System.Diagnostics.Process.Start使用

热门文章

  1. Linux之more命令
  2. HNOI2004 树的计数 和 HNOI2008 明明的烦恼
  3. 关于div的水平垂直居中
  4. Eclips的JDK更换为1.8
  5. cookbook 10.1生成随机密码
  6. 移动端布局Rem
  7. 2018第九届蓝桥杯C/C++ A组试题答案参考
  8. jQuery属性操作之类样式操作
  9. tsconfig.json配置说明
  10. 关于我&留言板