锁池:某个线程中调用了对象锁的notify()方法之后,争夺执行权,进入锁池。
等待池:某个线程中调用了对象锁的wait()方法之后,该线程主动放弃执行权并等待唤醒,进入待待池。
public class ThreadTest{ int count=0; Object obj = new Object(); public static void main(String[] args) { ThreadTest tt = new ThreadTest(); Thread1 t1 = tt.new Thread1(); Thread2 t2 = tt.new Thread2(); t1.start(); t2.start(); } class Thread1 extends Thread{ public void run(){ synchronized (obj) { while(true){ System.out.println(Thread.currentThread().getId()+”–“+count); count++; obj.notify(); try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } class Thread2 extends Thread{ public void run(){ synchronized (obj) { while(true){ System.out.println(Thread.currentThread().getId()+”–“+count); count–; obj.notify(); try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }
输出: 9–0 10–1 9–0 10–1 9–0 10–1 ……
需要注意的是,wait()可以设定等待时间。
java.lang.Object.wait(long timeout)
导致当前线程等待,直到其他线程调用此对象的 notify() 方法或notifyAll()方法,或在指定已经过去的时间。
timeout — 最大等待时间(毫秒) 大约已经到达指定的实际时间。但是,如果 timeout 为零,则不考虑实际时间,在获得通知前该线程将一直等待。
等待池:
假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。 锁池:
如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池。