等待唤醒机制可以基于wait和notify方法来实现,在一个线程内调用该线程锁对象的wait方法,线程将进入等待队列进行等待直到被唤醒。
ublic class WaitTest { private static Object lock = new Object(); private static boolean flag = true; public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { synchronized (lock){ while (flag){ try { System.out.println("wait start ......."); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("wait end ....... "); } } }).start(); new Thread(new Runnable() { @Override public void run() { if (flag){ synchronized (lock){ if (flag){ lock.notify(); System.out.println("notify ......."); flag = false; } } } } }).start(); } }
LockSupport是JDK中用来实现线程阻塞和唤醒的工具,线程调用park则等待“许可”,调用unpark则为指定线程提供“许可”。使用它可以在任何场合使线程阻塞,可以指定任何线程进行唤醒,并且不用担心阻塞和唤醒操作的顺序,但要注意连续多次唤醒的效果和一次唤醒是一样的。
public class LockSupportTest { public static void main(String[] args) { Thread parkThread = new Thread(new ParkThread()); parkThread.start(); System.out.println("唤醒parkThread"); LockSupport.unpark(parkThread); } static class ParkThread implements Runnable{ @Override public void run() { System.out.println("ParkThread开始执行"); LockSupport.park(); System.out.println("ParkThread执行完成"); } } }