源码:
public static void park(Object blocker) { Thread t = Thread.currentThread(); setBlocker(t, blocker); UNSAFE.park(false, 0L); setBlocker(t, null); }
public static void unpark(Thread thread) { if (thread != null) UNSAFE.unpark(thread); }
从源码可以看出,最终是通过调用unsafe的park和unpark方法。
public native void unpark(Object obj)
public native void park(boolean isAbsolute,long time)
isAbsolute参数是指明时间是绝对的(true),还是相对的(false).
如果是相对的,time的单位是纳秒,使线程阻塞多少纳秒,如(3秒后: 3*1000*1000*1000),如果为0则是无限阻塞...
如果是绝对的,time的单位是毫秒,使线程阻塞到指定时间点, 如(2秒后:System.currentTimeMillis()+2000);
--------
unpark相当于资源数量设置为1, 可以多次调用,但和执行一次没有区别。
park相当于使用资源,把资源数量设置成0。调用时候,如果资源数为1,则不会阻塞线程,如果资源数已经为0则会阻塞线程。
park与unpark的优势:
在多线程的时候,可以在不同的线程调用park或者unpark,不需要像调用wait/notify/notifyAll时,使用一个Object对象存储相应状态,如一个对象调用了wait需要调用notify唤醒,否则就会一直wait,notify只会唤醒一个线程,如果有两个线程调用同一对象的wait,则需要调用notifyAll才行。park和unpark解耦了线程之间的的同步问题。