Java Object 类也提供了线程操作的方法,下面我们来了解一下
.1)wait
wait()方法为Object类的方法,主要用于线程间通信,调用wait()方法的时候,线程会放弃对象锁(sleep 不会放弃对象锁),进入等待此对象的等待锁定池,只有针对此对象调用notify()方法(或notifyAll())后本线程才进入对象锁定。
注:如果调用某个对象的wait()方法,当前线程必须拥有这个对象的monitor(即锁),因此调用wait()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法),因为wait方法放弃了对象锁,所以同步代码块可以被访问。
public class TestWait {
private Object obj=new Object();
class WaitTread1 extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":begin");
synchronized(obj){
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+":end");
}
}
class WaitThread2 extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":begin");
synchronized (obj) {
obj.notify();
}
System.out.println(Thread.currentThread().getName()+":end");
}
}
public static void main(String[] args) {
TestWait tw=new TestWait();
WaitTread1 wt1=tw.new WaitTread1();
WaitThread2 wt2=tw.new WaitThread2();
wt1.start();
wt2.start();
}
}
执行结果:
Thread-0:begin
Thread-1:begin
Thread-1:end
Thread-0:end
由结果我们可以看出,线程Thread-0在调用wait()方法后,Thread-1访问了obj对象,说明Thread-0放弃了obj的对象锁,同时Thread-0是在Thread-1执行notify()方法后被唤醒的。
.2)notify notifyAll
notify()和notifyAll()方法也同样是Object类的方法,notify()方法能够唤醒一个正在等待该对象锁的线程,当有多个线程都在等待该对象的锁的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知,nofityAll()方法能够唤醒所有正在等待该对象的锁的线程。