image.png

    image.png
    /*
    线程通信的例子:使用两个线程打印 1-100。线程1,线程2 交替打印

    涉及道德三个方法:
    wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。
    notify():一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级
    高的那个。
    notifyAll():一旦执行此方法,就会唤醒所有被wait的一个线程。

    说明:
    1.wait()、notify()、notifyAll()三个方法必须使用在同步代码块或同步方法中。
    2.wait()、notify()、notifyAll()三个方法的调用必须是同步代码块或同步方法中的同步监视器。
    否则,会出现IllegalMonitorStateException异常

    3.wait()、notify()、notifyAll()三个方法是定义在java.lang.Objet类中的。


    面试题:sleep() 和 wait()的异同?
    1.相同点:一旦执行方法,都可以使得当前线程进入阻塞状态
    2.不同点:①两个方法声明的位置不同:Thread类中声明sleep(), Object类中声明wait()
    ②调用的要求不同:sleep()可以在任何需要的场景下调用。wait()必须使用
    在同步代码块或同步方法中
    ③关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中:
    sleep()不会释放锁,wait()会释放锁。

    1. package com.atguigu.java3;
    2. /**
    3. * 线程通信的例子:使用两个线程打印 1-100。线程1,线程2 交替打印
    4. *
    5. * 涉及道德三个方法:
    6. * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。
    7. * notify():一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级
    8. * 高的那个。
    9. * notifyAll():一旦执行此方法,就会唤醒所有被wait的一个线程。
    10. *
    11. * 说明:
    12. * 1.wait()、notify()、notifyAll()三个方法必须使用在同步代码块或同步方法中。
    13. * 2.wait()、notify()、notifyAll()三个方法的调用者
    14. * 必须是同步代码块或同步方法中的同步监视器。
    15. * 否则,会出现IllegalMonitorStateException异常
    16. *
    17. * 3.wait()、notify()、notifyAll()三个方法是定义在java.lang.Objet类中的。
    18. *
    19. *
    20. * 面试题:sleep() 和 wait()的异同?
    21. * 1.相同点:一旦执行方法,都可以使得当前线程进入阻塞状态
    22. * 2.不同点:①两个方法声明的位置不同:Thread类中声明sleep(), Object类中声明wait()
    23. * ②调用的要求不同:sleep()可以在任何需要的场景下调用。wait()必须使用
    24. * 在同步代码块或同步方法中
    25. * ③关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中:
    26. * sleep()不会释放锁,wait()会释放锁。
    27. *
    28. *
    29. * @author Dxkstart
    30. * @create 2021-05-07 20:42
    31. */
    32. public class CommunicationTest {
    33. public static void main(String[] args) {
    34. Number n = new Number();
    35. Thread t1 = new Thread(n);
    36. Thread t2 = new Thread(n);
    37. t1.setName("线程1:");
    38. t2.setName("线程2:");
    39. t1.start();
    40. t2.start();
    41. }
    42. }
    43. class Number implements Runnable{
    44. private int number = 1;
    45. @Override
    46. public void run() {
    47. while (true) {
    48. synchronized (this) {
    49. notify();
    50. if(number <= 100){
    51. System.out.println(Thread.currentThread().getName() +
    52. ": "+ number);
    53. number ++;
    54. try {
    55. //使得调用如下wait()的线程进入阻塞状态
    56. wait();
    57. } catch (InterruptedException e) {
    58. e.printStackTrace();
    59. }
    60. }else{
    61. break;
    62. }
    63. }
    64. }
    65. }
    66. }