事例代码:
class MyThread_1 extends Thread { Object lock; public MyThread_1(Object o) { lock=o; } public void run() { try { synchronized(lock) { System.out.println("Enter Thread_1 and wait"); lock.wait(); System.out.println("be notified"); } }catch(InterruptedException e){} } } class MyThread_2 extends Thread { Object lock; public MyThread_2(Object o) { lock=o; } public void run() { synchronized(lock) { System.out.println("Enter Thread_2 and notify"); lock.notify(); } } } public class MyThread { public static void main(String[] args) { int[] in=new int[0];//notice MyThread_1 t1=new MyThread_1(in); MyThread_2 t2=new MyThread_2(in); t1.start(); t2.start(); } } |
执行结果如下:
Enter Thread_1 and wait
Enter Thread_2 and notify
Thread_1 be notified
可能你注意到了在使用wait and notify方法得时候我使用了synchronized块来包装这两个方法,这是由于调用这两个方法的时候线程必须获得锁,也就是上面代码中的lock[],如果你不用synchronized包装这两个方法的得话,又或则锁不一是同一把,比如在MyThread_2中synchronized(lock)改为synchronized(this),那么执行这个程序的时候将会抛出java.lang.IllegalMonitorStateException执行期异常。另外wait and notify方法是Object中的,并不在Thread这个类中。最后你可能注意到了这点:int[] in=new int[0];为什么不是创建new Object而是一个0长度的数组,那是因为在java中创建一个0长度的数组来充当锁更加高效。
Thread作为java中一重要组成部分,当然还有很多地方需要更深刻的认识,上面只是对Thread的一些常识和易错问题做了一个简要的总结,若要真正的掌握java的线程,还需要自己多做总结。
相关链接: