模仿CountDownLatch类自定义倒时计时器
简介
这里模仿CountDownLatch类自定义到时计时器,利用AQS模板中的尝试获得共享和释放共享
1、MyCountDownLatch
package com.jacky; import com.sun.corba.se.impl.orbutil.concurrent.Sync; import java.util.concurrent.locks.AbstractQueuedSynchronizer; /**
* Created by jacky on 2018/2/11.
*/
public class MyCountDownLatch { private final Sync sync; public MyCountDownLatch(int count){
sync = new Sync(count);
}
static class Sync extends AbstractQueuedSynchronizer{
public Sync(int count){
setState(count);
} /**
* 计时器小于0的时候就会继续等待
* @param arg
* @return
*/
@Override
protected int tryAcquireShared(int arg) {
return getState() ==0 ?1 : -1;
} @Override
protected boolean tryReleaseShared(int arg) {
for (;;){
int state = getState();
System.out.println("-------"+state+"---------");
if (state == 0){
return false;
}
int newState = state-1;
if (compareAndSetState(state,newState)){
return newState==0;
}
}
}
} /**
*state不为0就把线程挂起
* @throws InterruptedException
*/
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
} /**
* 倒时计时器减1
*/
public void countDown(){
sync.releaseShared(1);
} }
2、测试
package com.jacky; import java.util.concurrent.CountDownLatch; /**
* Created by jacky on 2018/2/11.
*/
public class CountDownLatchDemo { public static void main(String[] args) {
Thread mainThread = Thread.currentThread();
//CountDownLatch latch = new CountDownLatch(4);
MyCountDownLatch latch = new MyCountDownLatch(4);
Runnable runnable = new Runnable() { @Override
public void run() {
try {
Thread.sleep((int)(Math.random()*100)); } catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("currentThread--"+Thread.currentThread().getName()+"--mainThread--"+mainThread.getName()
+"--mainThreadStatus--"+mainThread.getState());
latch.countDown();
}
};
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
Thread thread3 = new Thread(runnable);
Thread thread4 = new Thread(runnable);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("mainThread end");
}
}
模仿CountDownLatch类自定义倒时计时器的更多相关文章
- 模仿ReentrantLock类自定义锁
简介 临近过年了,没什么需求,今天模仿ReentrantLock自定义写了一个自己锁,在这里记录一下,前提是对AQS原理有所了解,分享给大家 1.自定义锁MyLock package com.jack ...
- (转)类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
转自:http://blog.csdn.net/lingxyd_0/article/details/8695747 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET B ...
- 关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究
关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究 测试代码:http://git.oschina.net/Xiyue/TabBarItem_TEST 简 ...
- Java 9 揭秘(7. 创建自定义运行时映像)
Tips 做一个终身学习的人. 在第一章节中,主要介绍以下内容: 什么是自定义运行时映像和JIMAGE格式 如何使用jlink工具创建自定义的运行时映像 如何指定命令名称来运行存储在自定义映像中的应用 ...
- 项目里出现两个配置类继承WebMvcConfigurationSupport时,为什么只有一个会生效(源码分析)
为什么我们的项目里出现两个配置类继承WebMvcConfigurationSupport时,只有一个会生效.我在网上找了半天都是说结果的,没有人分析源码到底是为啥,博主准备讲解一下,希望可以帮到大家! ...
- Spring-Redis缓存业务优化(通配符删除、两种自定义缓存时长)
application.yml配置 spring: cache: type: REDIS redis: time-to-live: PT300S # 默认缓存秒数 ...
- (转载)iOS UILabel自定义行间距时获取高度
本文介绍一下自定义行间距的UILabel的高度如何获取,需要借助一下开源的UILabel控件:TTTAttributedLabel 附下载地址 https://github.com/TTTAttrib ...
- block作为类的属性时用copy
1. block作为类的属性时用copy Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的 <栈 :由系统维护的局 ...
- iOS UILabel自定义行间距时获取高度
本文介绍一下自定义行间距的UILabel的高度如何获取,需要借助一下开源的UILabel控件:TTTAttributedLabel 附下载地址 https://github.com/TTTAttrib ...
随机推荐
- Spring框架学习06——AOP底层实现原理
在Java中有多种动态代理技术,如JDK.CGLIB.Javassist.ASM,其中最常用的动态代理技术是JDK和CGLIB. 1.JDK的动态代理 JDK动态代理是java.lang.reflec ...
- POJ.1655 Balancing Act POJ.3107 Godfather(树的重心)
关于树的重心:百度百科 有关博客:http://blog.csdn.net/acdreamers/article/details/16905653 1.Balancing Act To POJ.165 ...
- jQuery UI练习
jQuery UI 是建立在 jQuery JavaScript 库上的一组用户界面交互.特效.小部件及主题.无论您是创建高度交互的 Web 应用程序还是仅仅向窗体控件添加一个日期选择器,jQuery ...
- C/C++ 下的void main()
很多人甚至市面上的一些书籍,都使用了void main( ),其实这是错误的.C/C++ 中从来没有定义过void main( ).C++之 父 Bjarne Stroustrup在他的主页上的 FA ...
- Revit API创建房间
start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] ); ...
- 写自己的ASP.NET MVC框架(下)
上篇博客[写自己的ASP.NET MVC框架(上)] 我给大家介绍我的MVC框架对于Ajax的支持与实现原理.今天的博客将介绍我的MVC框架对UI部分的支持. 注意:由于这篇博客是基于前篇博客的,因此 ...
- JPA查询单个字段和多个字段返回类型总结
原文地址:https://blog.csdn.net/weixin_40326509/article/details/80865646 在使用springboot中,需要使用JPQL和SQL去查询记录 ...
- [leetcode]Minimum Window Substring @ Python
原题地址:https://oj.leetcode.com/problems/minimum-window-substring/ 题意: Given a string S and a string T, ...
- Android定位&地图&导航——基于百度地图实现的定位功能
一.问题描述 LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位.地图.导航等,首先我们看如何基于百度地图实现定位功能 二.配置环境 1.注册 ...
- python 获取前一天或前N天的日期
简单实现 import datetime # 获取前1天或N天的日期,beforeOfDay=1:前1天:beforeOfDay=N:前N天 def getdate(self,beforeOfDay) ...