简介

这里模仿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类自定义倒时计时器的更多相关文章

  1. 模仿ReentrantLock类自定义锁

    简介 临近过年了,没什么需求,今天模仿ReentrantLock自定义写了一个自己锁,在这里记录一下,前提是对AQS原理有所了解,分享给大家 1.自定义锁MyLock package com.jack ...

  2. (转)类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?

    转自:http://blog.csdn.net/lingxyd_0/article/details/8695747 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET B ...

  3. 关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究

      关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究 测试代码:http://git.oschina.net/Xiyue/TabBarItem_TEST 简 ...

  4. Java 9 揭秘(7. 创建自定义运行时映像)

    Tips 做一个终身学习的人. 在第一章节中,主要介绍以下内容: 什么是自定义运行时映像和JIMAGE格式 如何使用jlink工具创建自定义的运行时映像 如何指定命令名称来运行存储在自定义映像中的应用 ...

  5. 项目里出现两个配置类继承WebMvcConfigurationSupport时,为什么只有一个会生效(源码分析)

    为什么我们的项目里出现两个配置类继承WebMvcConfigurationSupport时,只有一个会生效.我在网上找了半天都是说结果的,没有人分析源码到底是为啥,博主准备讲解一下,希望可以帮到大家! ...

  6. Spring-Redis缓存业务优化(通配符删除、两种自定义缓存时长)

    application.yml配置 spring:    cache:     type: REDIS     redis:       time-to-live: PT300S # 默认缓存秒数   ...

  7. (转载)iOS UILabel自定义行间距时获取高度

    本文介绍一下自定义行间距的UILabel的高度如何获取,需要借助一下开源的UILabel控件:TTTAttributedLabel 附下载地址 https://github.com/TTTAttrib ...

  8. block作为类的属性时用copy

    1. block作为类的属性时用copy Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的 <栈 :由系统维护的局 ...

  9. iOS UILabel自定义行间距时获取高度

    本文介绍一下自定义行间距的UILabel的高度如何获取,需要借助一下开源的UILabel控件:TTTAttributedLabel 附下载地址 https://github.com/TTTAttrib ...

随机推荐

  1. Python爬虫之requests+正则表达式抓取猫眼电影top100以及瓜子二手网二手车信息(四)

    requests+正则表达式抓取猫眼电影top100 一.首先我们先分析下网页结构 可以看到第一页的URL和第二页的URL的区别在于offset的值,第一页为0,第二页为10,以此类推. 二.< ...

  2. IdentityServer4-从数据库获取User进行授权验证(五)

    本节将在第四节基础上介绍如何实现IdentityServer4从数据库获取User进行验证,并对Claim进行权限设置. 一.新建Web API资源服务,命名为ResourceAPI (1)新建API ...

  3. 移动端Tap与滑屏实战技巧总结以及Vue混合开发自定义指令

    最近在忙混合开发,因交互相对复杂,所以也踩了很多坑.在此做一下总结. 1.tap事件的实际应用 在使用tap事件时,老生常谈的肯定是点透问题,大多情况下,在有滑屏交互的页面时,我们会在根节点阻止默认行 ...

  4. python有序字典OrderedDict()

    转python创建有序字典OrderedDict # -*- coding:utf-8 -*- """ python有序字典 需导入模块collections " ...

  5. IdentityServer4-端点

    一.发现端点 二.授权端点 三.令牌端点 四.UserInfo端点 五.Introspection端点 六.撤销端点 七.结束会话端点 一.发现端点 发现端点可用于检索有关IdentityServer ...

  6. C#窗体向另一个窗体实时传值及传值问题

    C#窗体向另一个窗体实时传值  另外的传值方法:

  7. android TextView如何换行?

    具体代码是: rb_zuotian.setText("第一行"+"\n"+"第二行"); rb_jintian.setText(DateUt ...

  8. git 变基(无卵用)

    在当前分支执行rebase即可,会将提交的记录变成一条直线 git rebase

  9. zabbix 触发器

    概观 项目只收集数据.要自动评估传入数据,我们需要定义触发器.触发器包含一个表达式,该表达式定义数据的可接受级别的阈值. 如果这一级别超出了传入的数据,触发器将“ fire 触发”或进入“' Prob ...

  10. Oracle ERP Audit Funtion in R12.2.4

    M1 JOB NAME:  164839 TABLE NAME: WIP_REQUIREMENT_OPERATIONS Request name: AuditTrail Update Tables O ...