Java中的线程状态(详见Java线程状态及转换-MarchOn):

Java线程状态及 wait、sleep、join、interrupt、yield等的区别

  • 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 }
View Code

相关文章: