标签:获得 链接 shu 指定 tps not 必须 The native
park()
和 unpark()
的作用分别是阻塞线程和解除阻塞线程,而且 park()
和 unpark()
不会遇到 " Thread.suspend " 和 " Thread.resume " 所可能引发的 死锁 问题。
park()
和 unpark()
有许可的存在。park()
的线程和另一个试图将其 unpark()
的线程之间的竞争将保持活性。// 返回提供给最近一次尚未解除阻塞的 park 方法调用的 blocker 对象,如果该调用不受阻塞,则返回 null。
static Object getBlocker(Thread t)
// 为了线程调度,禁用当前线程,除非许可可用。
static void park()
// 为了线程调度,在许可可用之前禁用当前线程。
static void park(Object blocker)
// 为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用。
static void parkNanos(long nanos)
// 为了线程调度,在许可可用前禁用当前线程,并最多等待指定的等待时间。
static void parkNanos(Object blocker, long nanos)
// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
static void parkUntil(long deadline)
// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
static void parkUntil(Object blocker, long deadline)
// 如果给定线程的许可尚不可用,则使其可用。
static void unpark(Thread thread)
park()
和 unpark()
方法。
park()
函数则等待 " 许可 ",有点像信号量,但是这个 " 许可 " 是不能叠加的," 许可 " 是一次性的。可以理解为设置一个变量 0,1 之间的切换。unpark()
函数,当线程 A 调用 park()
函数就使用了这个 " 许可 ",如果线程 A 第二次调用 park()
,则进入等待状态。unpark()
函数可以先于 park()
调用。
unpark()
函数,给线程 A 一个 " 许可 ",那么当线程 A 调用 park()
时,发现已经有 " 许可 ",可以马上继续运行,不会阻塞。//阻塞线程
public native void park(boolean isAbsolute, long time);
//取消阻塞线程
public native void unpark(Object thread);
park()
方法后,会禁用当前线程,以下几种情况时,线程会被唤醒。
unpark()
。(调用 unpark 方法)public static void park(Object blocker) {
//获取当前线程
Thread t = Thread.currentThread();
//设置线程的blocker对象
setBlocker(t, blocker);
//通过UNSAFE调用,挂起线程
UNSAFE.park(false, 0L);
//挂起的线程被唤醒以后,需要将阻塞的Blocker清理掉。
setBlocker(t, null);
}
获取当前线程,设置当前线程的 parkBlocker 字段,调用 Unsafe 类的 park()
方法,再次调用setBlocker 的原因。
park()
方法之后,当前线程已被阻塞。unpark()
方法被调用,该线程获得许可后,继续进行下面的代码,setBlocker()
参数 parkBlocker 字段设置为 null,这样就完成了整个 park()
方法的逻辑。setBlocker 修改的是 parkBlockerOffset 变量。
Class<?> tk = Thread.class;
parkBlockerOffset = UNSAFE.objectFieldOffset(tk.getDeclaredField("parkBlocker"));
public static void parkNanos(Object blocker, long nanos) {
if (nanos > 0) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
UNSAFE.park(false, nanos);
setBlocker(t, null);
}
}
public static void parkUntil(Object blocker, long deadline) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
UNSAFE.park(true, deadline);
setBlocker(t, null);
}
park()
上受阻塞,将解除其阻塞状态。
park()
不会受阻塞。public static void unpark(Thread thread) {
if (thread != null)
UNSAFE.unpark(thread);
}
标签:获得 链接 shu 指定 tps not 必须 The native
原文地址:https://www.cnblogs.com/youngao/p/12573306.html