为了支持多线程之间的操作,jdk提供了线程等待(wait)和线程通知(notity)两个非常重要的方法,这两个方法是来自object类而不是thread类中。所以任何对象都可以调用这两个方法 。
当一个对象调用了wait()方法后,当前线程就会在这个对象上等待,直至其他线程调用了notity(),这就是线程之间的通信手段
如果一个线程调用了obj.wait(),它就会计入object对象的等待队列,在这个队列中,可能有多个线程,因为系统运行多个线程同时等待某一个对象。当object.notity()被调用时,它就会在这个等待的队列中,随机选择一个线程,并将其唤醒。
注意:1.这个唤醒是不公平的,不遵循先进先出,完全是随机的
2.wai()方法不是随便可以调用的,必须包含在synchronizied语句中
除notity()外,还有一个类似的方法notityAll(),顾名思义,就是唤醒所有等待的线程
为了方法理解,以下是一个简单的demo
public class waitAndNotity {
final static Object object = new Object();
public static class T1 extends Thread{
public void run(){
synchronized (object) {//声明对象所
System.out.println(System.currentTimeMillis()+":T1 start");
try {
System.out.println(System.currentTimeMillis()+"T1 wait for object");
object.wait();
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println(System.currentTimeMillis()+":T1 end!");
}
}
}
public static class T2 extends Thread{
public void run(){
synchronized (object) { //声明对象所
System.out.println(System.currentTimeMillis()+":T2 start!notity one thread ");
object.notify();
System.out.println(System.currentTimeMillis()+": T2 end!");
try {
Thread.sleep(2000);//测试,为了让效果更明显
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Thread t1 = new T1();
Thread t2 = new T2();
t1.start();
t2.start();
}
运行结果如下:
1502950336523:T1 start
1502950336523T1 wait for object
1502950336523:T2 start!notity one thread
1502950336523: T2 end!
1502950338523:T1 end!
有兴趣的可以继续查看下一节------线程挂起(susend)和通知(resume)