For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
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线程立即获得许可证不再进行阻塞。
达内时代科技集团致力于培养面向电信和金融领域Java、C++、C#/.Net、Android、IOS、PHP、嵌入式、软件测试、UID、网络营销、网络工程、会计、UED、web、Unity3D、大数据、人工智能、云计算、童程童美等26大方向中高端软件人才课程与少儿教育课程。选择合肥软件开发培训,不再孤军奋战,轻轻松松做IT高薪白领。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请添加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。