Java中的线程状态(详见Java线程状态及转换-MarchOn):
- wait:Object类的实例方法,释放CPU执行权,进入等待状态,直到 被中断、被拥有该对象锁的线程唤醒(notify或notifyAll)、wait时间到了自己唤醒 三者之一发生。会释放所持有的对象锁。(关于 wait、notiy、notifyAll的配合原理见后面)
示例:wait()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在获得对象锁后执行即在 synchronized函数或synchronized block中进行调用,否则如果虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。
1 package buaa.act.ucar.imtg.main; 2 3 /** 4 * @author zsm 5 * @date 2017年3月3日 上午10:23:53 6 */ 7 public class Test extends Thread { 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 Test test = new Test(); 11 test.start(); 12 try { 13 synchronized (test) { 14 Thread.sleep(1000); 15 System.out.println("wake the thread in main..."); 16 test.isFire = true; 17 test.notify(); 18 } 19 20 } catch (InterruptedException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 } 25 26 /** 27 * 线程锁 28 */ 29 private final Object object = new Object(); 30 31 private volatile boolean isFire = false; 32 33 @Override 34 public void run() { 35 System.out.println("开始执行线程。。。"); 36 System.out.println("进入等待状态。。。"); 37 synchronized (this) { 38 try { 39 while (!isFire) { 40 wait(); 41 } 42 } catch (InterruptedException e) { 43 e.printStackTrace(); 44 } 45 } 46 System.out.println("线程结束。。。"); 47 } 48 }