多线程同步工具——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的时候,代表所有线程完成 ...
随机推荐
- .NET Core系列 :4 测试
2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...
- 微软发布正式版SQL Server 2016
微软于今天在SQL 官方博客上宣布 SQL Server 数据库软件的正式发布版本(GA),历时一年多,微软为该软件发布了多个公共预览版和候选版本,而今天最终版本终于上线了.在博客中,微软数据集团的企 ...
- Python的单元测试(一)
title: Python的单元测试(一) author: 青南 date: 2015-02-27 22:50:47 categories: Python tags: [Python,单元测试] -- ...
- spark处理大规模语料库统计词汇
最近迷上了spark,写一个专门处理语料库生成词库的项目拿来练练手, github地址:https://github.com/LiuRoy/spark_splitter.代码实现参考wordmaker ...
- iOS微信里打开app,Universal Links
这两天在弄分享,从第三方应用或者浏览器打开自己app的东西 传统的方式是通过URL Scheme的方式,但是iOS9以后又出了新的更完美的方式Universal Links. 传统的URL Schem ...
- IL异常处理
异常处理在程序中也算是比较重要的一部分了,IL异常处理在C#里面实现会用到一些新的方法 1.BeginExceptionBlock:异常块代码开始,相当于try,但是感觉又不太像 2.EndExcep ...
- JavaScript求两个数字之间所有数字的和
这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...
- Android中Fragment和ViewPager那点事儿(仿微信APP)
在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- Configure a bridged network interface for KVM using RHEL 5.4 or later?
environment Red Hat Enterprise Linux 5.4 or later Red Hat Enterprise Linux 6.0 or later KVM virtual ...