多线程同步工具——LockSupport
用例1:子线程等待主线程发放许可!
public static void main(String[] args) {
Thread thread = new Thread(){
public void run(){
System.out.println("子线程 -> 测试通行许可!");
LockSupport.park();
System.out.println("子线程 -> 已通行!");
}
};
thread.start();
System.out.println("主线程 -> 休眠1秒!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程 -> 发放通行许可于子线程!");
LockSupport.unpark(thread);
/*
运行结果:
主线程 -> 休眠1秒!
子线程 -> 测试通行许可!
主线程 -> 发放通行许可于子线程!
子线程 -> 已通行!
*/
}
用例2:主线程提前发放许可给子线程!
public static void main(String[] args) {
Thread thread = new Thread(){
public void run(){
System.out.println("子线程 -> 休眠1秒!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("子线程 -> 测试通行许可!");
LockSupport.park();
System.out.println("子线程 -> 已通行!");
}
};
thread.start();
System.out.println("主线程 -> 提前发放通行许可于子线程!");
LockSupport.unpark(thread);
/*
运行结果:
主线程 -> 提前发放通行许可于子线程!
子线程 -> 休眠1秒!
子线程 -> 测试通行许可!
子线程 -> 已通行!
*/
}
用例3:子线程传递数据给主线程。
public static void main(String[] args) {
Thread thread = new Thread(){
public void run(){
System.out.println("子线程 -> 测试通行许可!并提供通行证:A");
LockSupport.park(new String("A"));
System.out.println("子线程 -> 已通行!");
}
};
thread.start();
System.out.println("主线程 -> 休眠1秒!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程 -> 检查并处理子线程的通行证:" + LockSupport.getBlocker(thread));
System.out.println("主线程 -> 许可子线程通行!");
LockSupport.unpark(thread);
/*
运行结果:
主线程 -> 休眠1秒!
子线程 -> 测试通行许可!并提供通行证:A
主线程 -> 检查并处理子线程的通行证:A
主线程 -> 许可子线程通行!
子线程 -> 已通行!
*/
}
全部操作:
- park()/park(Object)
等待通行准许。 - parkNanos(long)/parkNanos(Object, long)
在指定运行时间(即相对时间)内,等待通行准许。 - parkUntil(long)/parkUntil(Object, long)
在指定到期时间(即绝对时间)内,等待通行准许。 - unpark(Thread)
发放通行准许或提前发放。(注:不管提前发放多少次,只用于一次性使用。) - getBlocker(Thread)
进入等待通行准许时,所提供的对象。
主要用途:
当前线程需要唤醒另一个线程,但是只确定它会进入阻塞,但不确定它是否已经进入阻塞,因此不管是否已经进入阻塞,还是准备进入阻塞,都将发放一个通行准许。
正确用法:
把LockSupport视为一个sleep()来用,只是sleep()是定时唤醒,LockSupport既可以定时唤醒,也可以由其它线程唤醒。
多线程同步工具——LockSupport的更多相关文章
- Java多线程同步工具类之CountDownLatch
在过去我们实现多线程同步的代码中,往往使用join().wait().notiyAll()等线程间通信的方式,随着JUC包的不断的完善,java为我们提供了丰富同步工具类,官方也鼓励我们使用工具类来实 ...
- Java多线程同步工具类之Semaphore
Semaphore信号量通常做为控制线程并发个数的工具来使用,它可以用来限制同时并发访问资源的线程个数. 一.Semaphore使用 下面我们通过一个简单的例子来看下Semaphore的具体使用,我们 ...
- 多线程同步工具——volatile变量
关于volatile,找了一堆资料看,看完后想找一个方法去做测试,测了很久,感觉跟没有一样. 这本书<深入理解Java内存模型>,对volatile描述中有这样一个比喻的说法,如下代码所示 ...
- 多线程同步工具——CAS原子变量
这是我参考的一篇文章<基于CAS的乐观锁实现>,讲述的是一种需要CPU支持的执行技术CAS(Compare and Swap). 首先理解什么是原子性操作,意思是不能再拆分的操作,例如改写 ...
- Java多线程同步工具类之CyclicBarrier
一.CyclicBarrier使用 CyclicBarrier从字面上可以直接理解为线程运行的屏障,它可以让一组线程执行到一个共同的屏障点时被阻塞,直到最后一个线程执行到指定位置,你设置的执行线程就会 ...
- 多线程同步工具——Lock
本文原创,转载请注明出处. 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> 锁分独占锁与共享锁, ...
- JAVA多线程提高十:同步工具CyclicBarrier与CountDownLatch
今天继续学习其它的同步工具:CyclicBarrier与CountDownLatch 一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公 ...
- Java多线程_同步工具CyclicBarrier
CyclicBarrier概念:CyclicBarrier是多线程中的一个同步工具,它允许一组线程互相等待,直到到达某个公共屏障点.形象点儿说,CyclicBarrier就是一个屏障,要求这一组线程中 ...
- Java多线程_同步工具CountDownLatch
概念:CountDownLatch是多线程里面一个类似于计数器的高级同步工具,它的初始值代表线程的数量,当一个线程完成了任务后,CountDownLatch的值就减1,当值为0的时候,代表所有线程完成 ...
随机推荐
- C#与C++的发展历程第三 - C#5.0异步编程巅峰
系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...
- 7.让网站支持http和https的访问方式
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#iis 怎么让网站在本地支持SSL?http://www.c ...
- [APUE]UNIX进程的环境(上)
一. 前言 本章将学习:当执行程序时,其main函数是如何被调用的,命令行参数是如何传送给执行程序的,典型的存储器布局是什么样式,如何分配另外的存储空间,进程如何使用环境变量,进程终止的不同方式等.另 ...
- MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示
上次创建了栏目模型,这次主要做栏目的前台显示.涉及到数据存储层.业务逻辑层和Web层.用到了迁移,更新数据库和注入的一些内容. 一.添加数据存储层 1.添加Ninesky.DataLibrary(与上 ...
- ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...
- SDWebImage源码解读 之 UIImage+GIF
第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...
- nginx服务器安装及配置文件详解
nginx在工作中已经有好几个环境在使用了,每次都是重新去网上扒博客,各种编译配置,今天自己也整理一份安装文档和nginx.conf配置选项的说明,留作以后参考.像负载均衡配置(包括健康检查).缓存( ...
- CSS入门常见的问题
写在前面:本文简单介绍一下css的三大特性:层叠性.继承性.优先级.以及margin,padding,浮动,定位几个知识点.限于水平,不深入探讨,仅作为学习总结. 1,三特性 1)层叠性:同标签同权重 ...
- Asp.Net 5 新增公告仓库
一直以来Asp.Net 5 都没有一个比较统一的公告页,对于一个在日夜更新的项目来说,很多人经常会遇到问题但是不知道去哪里寻找帮助,现在Asp.Net 5 项目组新增了一个公告仓库来解决这个问题. ...
- vs 2015 "加载该页时出错。" 解决方案
错误信息: 加载该页时出错. 未找到与约束 ContractName Microsoft.CodeAnalysis.Editor.TypeScript.ScriptContexts.ITypeSc ...