线程通讯的例子:使用两个线程打印1-100,线程1 线程2 交替打印java
package org.zhanghl.examples; /* * 线程通讯的例子:使用两个线程打印1-100,线程1 线程2 交替打印 * 涉及到的三个方法 * wait():一旦执行此方法,当前线程进入阻塞状态,并释放同步监视器 * notify():执行此方法,会唤醒被wait的一个线程,若是有多个线程被wait,就唤醒优先级高的 * notifyAll():执行此方法,就会唤醒全部被wait的线程。 * * 说明: * 1.wait notify notifyAll 三个方法,必须使用在同步代码块,或同步方法中。 * 2.wait notify notifyAll 三个方法的调用者必须是同步代码快或同步方法中的同步监视器。 * 不然会出现 java.lang.IllegalMonitorStateException 异常 * 3.wait notify notifyAll 三个方法 是定义在 java.lang.Object类中的 * * 面试题:sleep()和wait()的异同 * 1.相同点:一旦执行方法,均可以使得当前的线程进入阻塞状态。 * 2.不一样点,1)两个方法声明的位置不一样:Thread类中声明sleep(),Object类中声明wait() * 2)调用的要求不一样:sleep() 能够再任何须要的场景下调用。wait()必须使用在同步代码块或同步方法中。 * 3)关因而否释放同步监视器:若是两个方法都使用在同步代码块或同步方法中,sleep不会释放锁,wait会释放锁 * * */ class Number implements Runnable { private int number = 1; private Object obj=new Object(); @Override public void run() { while (true) { synchronized (obj) { obj.notify(); if (number <= 100) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + number); number++; try { //使得调用wait()方法的线程进入阻塞状态 wait释放锁 obj.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(); } }
面试题:sleep()和wait()的异同面试
1.相同点:一旦执行方法,均可以使得当前的线程进入阻塞状态。ide
2.不一样点,1)两个方法声明的位置不一样:Thread类中声明sleep(),Object类中声明wait()线程
2)调用的要求不一样:sleep() 能够再任何须要的场景下调用。wait()必须使用在同步代码块或同步方法中。code
3)关因而否释放同步监视器:若是两个方法都使用在同步代码块或同步方法中,sleep不会释放锁,wait会释放锁 *get