多线程同步工具——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的时候,代表所有线程完成 ... 
随机推荐
- 使用Zabbix监控Oracle数据库
			Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabb ... 
- nodejs中获取时间戳、时间差
			Nodejs中获取时间戳的方法有很多种,例如: new Date().getTime() Date.now() process.uptime() process.hrtime() 平时想获取一个时间戳 ... 
- 多线程爬坑之路-Thread和Runable源码解析
			多线程:(百度百科借一波定义) 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提 ... 
- CRL快速开发框架系列教程五(使用缓存)
			本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ... 
- jQuery.template.js 简单使用
			之前看了一篇文章<我们为什么要尝试前后端分离>,深有同感,并有了下面的评论: 我最近也和前端同事在讨论这个问题,比如有时候前端写好页面给后端了,然后后端把这些页面拆分成很多的 views, ... 
- 常用 meta 整理
			<!-- 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓 --> <meta name="HandheldFriendly" con ... 
- A*算法应用[转]
			转自:http://www.cnblogs.com/zhoug2020/p/3468167.html 这是一篇十分精彩/易懂的博客,感谢原博主!本文通过自己的理解在原博文基础上突出一些重点字眼,句子. ... 
- Oracle:一个用户操作多个表空间中表的问题(转)
			原文地址:http://blog.csdn.net/shmiloy001/article/details/6287317 首先,授权给指定用户. 一个用户的默认表空间只能有一个,但是你可以试下用下面的 ... 
- Linux设备管理(一)_kobject, kset,ktype分析
			Linux内核大量使用面向对象的设计思想,通过追踪源码,我们甚至可以使用面向对象语言常用的UML类图来分析Linux设备管理的"类"之间的关系.这里以4.8.5内核为例从kobje ... 
- Topshelf 支持Mono 扩展Topshelf.Linux
			使用Topshelf 5步创建Windows 服务 这篇文章大家可以了解到使用Topshelf可以很好的支持Windows服务的开发,但是它和Mono不兼容,Github上有一个扩展https://g ... 
