LockSupport简介
LockSupport是JDK提供的一个线程工具类,它位于rt.jar下面,它的主要作用是挂起和唤醒线程,LockSupport的实现是基于 Unsafe类的,使用LockSupport类的每一个线程都会与它关联一个许可证。
LockSupport主要方法
void unpark(Thread thread);
unpark()用来唤醒被挂起的线程,参数Thread为被阻塞的线程。
void park();
用来挂起当前线程,只有使用unpark(Thread thread)
或中断线程才会返回。
public class LockSupportTest {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
System.out.println("child thread start ");
LockSupport.park();
System.out.println("child thread end");
});
thread.start();
Thread.sleep(2000);
System.out.println("main thread");
LockSupport.unpark(thread);
}
}
如上,子线程输出
child thread start
被阻塞,然后在主线程中使用LockSupport.unpark(thread)
唤醒子线程,才往下执行。
使用线程中断返回
代码语言:javascript复制public class LockSupportTest {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
System.out.println("child thread start ");
LockSupport.park();
System.out.println("child thread end");
});
thread.start();
System.out.println("main thread");
thread.interrupt();
}
}
void park(Object blocker);
挂起线程,加了一个参数,其目的只是使线程对战提供更多的阻塞信息。
代码语言:javascript复制public class LockSupportMainTest {
public void test(){
LockSupport.park(this);
}
public static void main(String[] args) {
LockSupportMainTest lockSupportMainTest = new LockSupportMainTest();
lockSupportMainTest.test();
}
}
如上我们将this(LockSupportMainTest
)作为park
的参数,那么在线程堆栈的信息中将会记录LockSupportMainTest
。
查看线程堆栈信息
1.jps
查看pid
2.jstack pid查看线程堆栈信息
没有使用参数前(LockSupport.park())
使用参数后(LockSupport.park(this))
使用参数后多了一行- parking to wait for <0x000000076c094448> (a concurrent.locksupport.LockSupportMainTest)
关于下面的方法中有blocker
参数的,就不再提。
void parkNanos(long nanos);
此方法和park()
方法类似,不同之处是它传入了一个纳秒参数nanos
,park()
方法如果拿到许可证(unpark(thread)
)后就返回,如果没有 拿到许可证,那么会一直被挂起,而parkNanos(long nanos)
如果拿到许可证,也会立马返回,如果拿不到,则会在nanos
单位时间后返回。
public class LockSupportI {
public static void main(String[] args) {
System.out.println("start ");
//等待2秒后返回
LockSupport.parkNanos(2000000000);
System.out.println("end");
}
}
void parkNanos(Object blocker, long nanos);
此方法和parkNanos(long nanos)
一样,只是加入blocker
参数,其目的只是使线程对战提供更多的阻塞信息。
parkUntil(long deadline);
此方法的参数deadline
代表到什么时间返回,单位为毫秒,例如,现在是2022/2/11 11:11:11,deadline我设置到2022/2/11 11:11:20(转换为毫秒), 那么就隔了9秒,如果当前线程拿到许可证(unpark(thread)
)后就立刻返回,如果没有拿到,就9秒后返回。
public class LockSupportI {
public static void main(String[] args) {
System.out.println("start ");
//当前时间的3秒后返回
LockSupport.parkUntil(System.currentTimeMillis() 3000);
System.out.println("end");
}
}
void parkUntil(Object blocker, long deadline);
和parkUntil(long deadline)
一样,只是加入blocker
参数,其目的只是使线程对战提供更多的阻塞信息。
今天的分享就到这里,感谢你的观看,下期间