是什么
LockSupport 是JDK内部提供阻塞和唤醒线程的工具类。
-
void park()方法
如果线程未获得许可证的前提下,调用了park方法将进行阻塞,否则不会阻塞直接返回。
-
void unpark(Thread thread) 方法
当某线程调用unpark(Thread thread) 方法时,传入方法中对应的线程将会获得许可证。
-
void parkNanos(long nanos) 方法
与 park()方法类似,只不过该方法会等到nanos 秒之后,如发现还未获得许可证,那么将不会继续进行阻塞而是直接返回。
-
void park(Object blocker) 方法
与park()方法类似,只不过该方法将blocker对象信息存放到调用该park(Object blocker) 方法的线程的成员变量中去。
怎么用
需求:我们现在希望A线程等待B线程处理1+2+3+…+100 求和运算成功之后,继续处理它的逻辑,且看下面代码
public class LockSupportDemo {
public static void main(String[] args) throws NoSuchFieldException, InterruptedException {
Thread a = new Thread(() -> {
System.out.println("等待B线程完成它的求和逻辑...");
//2.
LockSupport.park();
System.out.println("B线程已处理完毕...A线程继续处理逻辑");
});
Thread b = new Thread(() -> {
sumCalc();
//3.
LockSupport.unpark(a);
});
a.start();
//1.
Thread.sleep(1000);
b.start();
}
private static void sumCalc() {
System.out.println("B线程进行求和运算中,结果为:" + IntStream.range(1, 100).reduce(0, Integer::sum));
}
}
运行结果:
等待B线程完成它的求和逻辑...
B线程进行求和运算中,结果为:4950
B线程已处理完毕...A线程继续处理逻辑
代码(1)处,我们对主线程进行sleep 1秒 是为了保证A线程能先执行。代码(2)处,A线程未取得许可证将进行阻塞。代码(3)处,B线程调用unpark(Thread thread)并将A线程传入,A线程立即获得许可证不再进行阻塞。
书写技术文章是一个循序渐进的过程,所以我不能保证每句话、每行代码都是对的,但至少能保证不复制、不粘贴,每篇文章都是自己对技术的认识、细心斟酌总结出来的。乔布斯说:我们在这个星球上的时间都很短,很少有机会去做几件真正伟大的事情,同时要做得好,我必须要趁我还年轻的时候完成这些事。
其实我想说的是,我是一枚程序员,我只想在有限的时间内尽可能去沉淀我这一生中所能沉淀下来的东西。