package DayTest23; /** * 线程通信例子:使用两个线程打印1-100.线程1,线程2交替打印 * * wait():一旦执行此方法,当前线程进入阻塞,并释放同步锁 * notify():一旦执行此方法就会唤醒被wait的一个线程,如果有多个被wait,那就唤醒优先级高的那个。 * notifyall():唤醒所有的被wait的线程。 * 说明: * 1.此三个方法必须使用在同步代码块或者同步方法中。 * 2.此三个方法的调用者必须是同步代码快或者同步方法中的同步锁。 * 否则会出现异常。 * 3.此三个方法都是定义在java.lang.object类中的。 * 面试:sleep()和wait()方法的异同 * 同:都会是当前线程进入阻塞状态 。 * 异:1.两个方法声名的位置不同。Thread类中声明sleep()方法,Object类中声明wait()方法。 * 2.调用的范围不同:sleep()可以在任何需要的场景下调用。wait()必须在同步代码块或者同步方法中。 * 3.关于是否释放同步监视器:如果两个方法都使用在同步代码快或者同步方法中,sleep不会释放 * 同步锁,wait()会释放锁。 * @author 冀帅 * @date 2020/8/5-19:39 */ class Number implements Runnable{ private int number = 1; @Override public void run() { while (true){ synchronized (this) { notify(); if (number<=100){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+number); number++; try { //使得调用如下wait方法的线程进入阻塞,会释放锁 wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else { break; } } } } } public class CommunicationTest { public static void main(String[] args) { Number number = new Number(); Thread t1 = new Thread(number); Thread t2 = new Thread(number); t1.setName("线程1"); t2.setName("线程2"); t1.start(); t2.start(); } }