[关闭]
@Cesar 2016-03-15T17:04:58.000000Z 字数 1763 阅读 1466

Java中wait(),notify(),notifyAll()方法的使用

Java 学习

方法简介

  1. wait()

    1. synchronized (lockObjectA) {
    2. try {
    3. lockObjectA.wait();
    4. } catch (InterruptedException e) {
    5. e.printStackTrace();
    6. }
    7. }

    此时,代码块中会释放对对象lockObjectA的锁定,同时使lockObjectA进行等待,直到有线程调用了它的notify()或notifyAll()方法,才继续将lockObjectA锁定,并继续执行下面程序。
    即:调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。

  2. notify()

    1. synchronized (lockObjectA) {
    2. lockObjectA.notify();
    3. }

    唤醒在等待该对象同步锁的线程(只唤醒一个),在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
    即:调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。

  3. notifyAll()
    将所有等待该对象的线程全部唤起。

示例

  1. package Test0315;
  2. /**
  3. * Created by Cesar on 2016/3/15.
  4. */
  5. public class TestWait extends Thread {
  6. private static Object lockObjectA = new Object();
  7. private int key;
  8. public TestWait(int key) {
  9. this.key = key;
  10. }
  11. @Override
  12. public void run() {
  13. if (key == 0) {
  14. synchronized (lockObjectA) {
  15. System.out.println(key + "开始等待");
  16. try {
  17. lockObjectA.wait();
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. }
  21. System.out.println(key + "等待结束");
  22. System.out.println(key + "成功锁定A");
  23. try {
  24. Thread.sleep(10000);
  25. } catch (InterruptedException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. System.out.println(key + "释放A");
  30. } else if (key == 1) {
  31. synchronized (lockObjectA) {
  32. lockObjectA.notify();
  33. }
  34. System.out.println(key + "释放了A");
  35. } else {
  36. synchronized (lockObjectA){
  37. System.out.println(3+"锁定了A");
  38. }
  39. }
  40. }
  41. public static void main(String[] args) {
  42. TestWait wait = new TestWait(0);
  43. wait.setName("Test Wait");
  44. wait.start();
  45. System.out.println("主线程休眠开始");
  46. try {
  47. Thread.sleep(5000);
  48. } catch (InterruptedException e) {
  49. e.printStackTrace();
  50. }
  51. System.out.println("主线程休眠结束,唤醒开始");
  52. TestWait wait1 = new TestWait(1);
  53. wait1.start();
  54. TestWait wait2 = new TestWait(2);
  55. try {
  56. Thread.sleep(1000);
  57. } catch (InterruptedException e) {
  58. e.printStackTrace();
  59. }
  60. wait2.start();
  61. try {
  62. wait2.join();
  63. } catch (InterruptedException e) {
  64. e.printStackTrace();
  65. }
  66. System.out.println("全部结束");
  67. }
  68. }

结果

  1. 主线程休眠开始
  2. 0开始等待
  3. 主线程休眠结束,唤醒开始
  4. 1释放了A
  5. 0等待结束
  6. 0成功锁定A
  7. 0释放A
  8. 3锁定了A
  9. 全部结束
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注