Count_Down

在一个主线程中,要求有大量子线程执行完之后,主线程才执行完成?多种方式,考虑效率。

…衆ロ難τιáo~ 提交于 2020-04-22 06:21:49
1、在主函数中使用join()方法 。 t1.start(); t2.start(); t3.start(); t1.join(); // 不会导致t1和t2和t3的顺序执行 t2.join(); t3.join(); System.out.println( "Main finished"); 2、CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 public class WithLatch{ public static void main(String[] args){ CountDownLatch latch = new CountDownLatch(3 ); for ( int i=0;i<3;i++ ){ new ChildThread(i,latch).start(); } try { latch.await(); } catch (InterruptedException e){ e.printStackTrace(); } System.out.println( "Main finished" ); } static calss ChildThread extends Thread{ private int id = -1 ; private CountDownLatch latch = null ;

java高并发系列

戏子无情 提交于 2020-04-22 04:58:47
这是java高并发系列第16篇文章。 本篇内容 介绍CountDownLatch及使用场景 提供几个示例介绍CountDownLatch的使用 手写一个并行处理任务的工具类 假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要统计解析总耗时。分析一下:解析每个sheet耗时可能不一样,总耗时就是最长耗时的那个操作。 我们能够想到的最简单的做法是使用join,代码如下: package com.itsoku.chat13; import java.util.concurrent.TimeUnit; /** * 微信公众号:javacode2018,获取年薪50万课程 */ public class Demo1 { public static class T extends Thread { //休眠时间(秒) int sleepSeconds; public T(String name, int sleepSeconds) { super(name); this.sleepSeconds = sleepSeconds; } @Override public void run() { Thread ct = Thread.currentThread(); long

django 发送手机验证码

我的梦境 提交于 2020-04-21 06:45:53
一、流程分析: 1.用户在项目前端,输入手机号,然后点击【获取验证码】,将手机号发到post到后台。 2.后台验证手机号是否合法,是否已被占用,如果通过验证,则生成验证码,并通过运行脚本,让短信运营商向该手机号,发送该验证码,如果没通过验证,则返回错误信息 3.用户收到短信验证码以后,再次将所有信息post到后台。 4.后台验证各个数据,通过验证则完成实名制认证,如果没通过则返回错误信息。 总结,一次实名验证,需要两次ajax+post 二、对接短信商: 1.在云片网端: 1.注册云片网 地址:https://www.yunpian.com/ 后台管理控制台页面:其中最重要的信息是APIKEY 2.开发者备案、新增签名、新增模板(模板管理) 1.云片网后台的【测试】是没有意义的,所谓的测试,就是直接给你手机发送一条短信,这算哪门子测试? 2.【签名/模板设备】页,【签名管理】点击【新增签名】,到这里会被提醒完善【开发者信息】,认证分为开发者的【公司】和【个人】,现在是开发测试阶段,可以先选择【个人】,【个人】要身份证的照片,提交照片。 3.等待认证完成的短信通知,然后按照后台的操作指引,在【签名管理】页【新增签名】,在【模板管理】页【新增模板】,这些都要等待云片网的审核,审核通过会有短信通知。 4.在云片网后台设置ip白名单,将外网ip加入白名单 获取本机外网ip最简单的方法

Java并发编程笔记之 CountDownLatch闭锁的源码分析

ぐ巨炮叔叔 提交于 2020-04-20 16:42:41
JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountDownLatch 与 线程的 join 方法区别是什么? 日常开发中经常会遇到需要在主线程中开启多线程去并行执行任务,并且主线程需要等待所有子线程执行完毕后再进行汇总的场景,它的内部提供了一个计数器,在构造闭锁时必须指定计数器的初始值,且计数器的初始值必须大于0。另外它还提供了一个countDown方法来操作计数器的值,每调用一次countDown方法计数器都会减1,直到计数器的值减为0时就代表条件已成熟,所有因调用await方法而阻塞的线程都会被唤醒。这就是CountDownLatch的内部机制,看起来很简单,无非就是阻塞一部分线程让其在达到某个条件之后再执行。但是CountDownLatch的应用场景却比较广泛,只要你脑洞够大利用它就可以玩出各种花样。最常见的一个应用场景是开启多个线程同时执行某个任务,等到所有任务都执行完再统计汇总结果。下图动态演示了闭锁阻塞线程的整个过程。 在CountDownLatch出现之前一般都是使用线程的join()方法来实现,但是join不够灵活,不能够满足不同场景的需求。接下来我们看看CountDownLatch的原理实现。 一

同步工具类—— CountDownLatch

最后都变了- 提交于 2020-04-18 12:28:23
本博客系列是学习并发编程过程中的记录总结。由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅。 并发编程系列博客传送门 CountDownLatch 简介 CountDownLatch 是JDK并发包中提供的一个同步工具类。官方文档对这个同步工具的介绍是: A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. 上面的英文介绍大致意思是: CountDownLatch 的主要功能是让一个或者多个线程等待直到一组在其他线程中执行的操作完成。 使用列子 观看上面的解释可能并不能直观的说明 CountDownLatch 的作用,下面我们通过一个简单的列子看下 CountDownLatch 的使用。 场景:主人(主线程)请客人(子线程)吃晚饭,需要等待所有客人都到了之后才开饭。我们用 CountDownLatch 来模拟下这个场景。 public class CountDownLatchDemo { private static final int PERSON_COUNT = 5; private static final CountDownLatch c =

sql优化:数据量过大查询优化

坚强是说给别人听的谎言 提交于 2020-04-17 07:38:39
【推荐阅读】微服务还能火多久?>>> 1.场景:有大数据的数据需要放到首页统计,一般就是聚合、分组之类的,按照年月日进行查询和统计。如果数据量比较少,几十万数据 没什么问题。但是随着数据量的增多,查询速度越来越慢。这个时候就需要去优化了~ 刚开始自己的想法是这样的:使用多线程的方式,因为查询每天的数据量很少,那么是不是可以使用多线程的方式,每个线程查询一天的,查询一个月30天,就用30个线程,这样速度会不会快些? 于是,用多线程的方式实现了下。代码如下: private ExecutorService executorService = new ThreadPoolExecutor( 30 , 30 , 1 , TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>()); public List<Map> getCiServiceBadEvaNumStatistic(SAASIndexQuery saasIndexQuery) throws InvocationTargetException, IllegalAccessException { String startDate = saasIndexQuery.getStartDate(); String endDate = saasIndexQuery.getEndDate(); int

带你看看Java的锁(三)-CountDownLatch和CyclicBarrier

微笑、不失礼 提交于 2020-04-12 13:36:56
带你看看Java中的锁CountDownLatch和CyclicBarrier 前言 基本介绍 使用和区别 核心源码分析 总结 前言 Java JUC包中的文章已经写了好几篇了,首先我花了5篇文章从源码分析的角度和大家讲了AQS,为什么花5篇时间讲这个,是因为AQS真的很重要,JUC中提供的很多实现都是基于AQS的,所以说看懂AQS中的代码很重要,看不懂的 多看几遍,上网多找找文章,这个时间学习的途径和资料真的很多,只要你愿意花时间,相信自己一定会比别人懂的更多! 好的,今天的废话有点儿多,进入正题吧,今天本来也继续写的是java中的锁 第三篇CountDownLatch的,但是发现CyclicBarrier在功能上与其有相似之处,但是其实2者是不同的实现,而且网上很多人都疑惑2者的使用场景和区别,今天就顺便一起写了吧 基本介绍 CountDownLatch CountDownLatch 中文翻译过来就是闭锁,倒计时锁的意思,CountDownLatch其实和Semaphore其所都是AQS中线程共享模式的实现,就是同时允许多个线程拥有一个资源,Semaphore是为了控制线程的并发数量,说白了就是控制占用资源的线程数量,CountDownLatch是创建闭锁的线程 等待多个占用资源的线程执行完成后 才能去执行自己的方法,可能解释的有点隐晦,下面我会通过demo去描述下

Redisson的CountDownLatch实现对比 VS Java的CountDownLat

爷,独闯天下 提交于 2020-04-12 09:45:10
JDK的CountDownLatch的设计思路 和锁类似,Java实现CountDownLatch的时候也利用了一个叫做AQS的东西,源码参照java.util.concurrent.locks.AbstractQueuedSynchronizer。 这个类的其中一个思想核心是内部的一个state状态变量,这个状态会告诉你当前的锁是否可用,当前的latch是否倒计时结束等等。 核心接口连个方法,一个是countDown,另一个是await,countDown是改变状态的,await可以类比对锁的等待。 先看countDown 这里使用自旋的方式,原子性改变状态,如果改变成功就返回true。注意这个latch是不可重复使用的,所以如果状态是0的话就无法再使用了。而doReleaseShared是为了唤醒所有await该latch的线程,具体的说明可以参照https://blog.csdn.net/xxcupid/article/details/51909921。 Redisson版本的CountDownLatch设计思路 和Redisson实现分布式锁类似,需要利用到Redis的订阅/发布来实现通知的操作,来唤醒所有await当前latch的所有线程。 这里有一个叫做ReclosableLatch的类继承了AQS, 看下和JDK的CountDownLatch的区别:

聊聊Elasticsearch的AtomicArray

耗尽温柔 提交于 2020-04-06 22:36:50
序 本文主要研究一下Elasticsearch的AtomicArray AtomicArray elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/util/concurrent/AtomicArray.java public class AtomicArray<E> { private final AtomicReferenceArray<E> array; private volatile List<E> nonNullList; public AtomicArray(int size) { array = new AtomicReferenceArray<>(size); } /** * The size of the expected results, including potential null values. */ public int length() { return array.length(); } /** * Sets the element at position {@code i} to the given value. * * @param i the index * @param value the new value */ public void set(int i,

记录下多线的题目

谁说我不能喝 提交于 2020-04-06 21:41:44
import java.util.*; import java.util.concurrent.TimeUnit; A 线程添加10个元素,B线程监视当A线程添加了5个元素则结束 public class Test { volatile List<Object> list= new ArrayList(); public void add(Object o){ list.add(o); } public int size(){ return list.size(); } public static void main(String args[]) { Test c = new Test(); final Object lock = new Object(); new Thread(() -> { synchronized (lock) { if (c.size() != 5) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } lock.notify(); System.out.println("t2 is end"); } }, "t2").start(); new Thread(() -> { synchronized (lock) { for (int i = 0;