線程通訊的例子:使用兩個線程打印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