线程等待——CountDownLatch使用
告警性能优化过程中,遇到如下问题:1、 在数据库计算几十万个实体的KPI值的方差;2、 计算结果进行表格化处理。
这里KPI包含多个Counter的数据库函数运算(比如Decode,AVG等函数),方差也是数据库函数运算,性能比较差。
步骤1中每个实体独立计算方差,步骤2需要方差结果协同处理,所以很自然的联想到步骤1分实体多线程处理,步骤2等待步骤1所有线程完成后才开始处理。这里我们使用CountDownLatch进行线程等待,示例代码如下:
package com.coshaho.threadpool; import java.util.concurrent.CountDownLatch; /**
* CountDownLatch学习
* @author coshaho
*/
public class MyCountDownLatch
{
public static void main(String[] args) throws InterruptedException
{
// 定义线程等待变量CountDownLatch,此处定义等待3个线程执行完成
CountDownLatch latch = new CountDownLatch(3);
// 定义3个线程,并传入线程等待变量
new Thread(new MyCountDownLatch().new MyWork("Thread1",latch)).start();
new Thread(new MyCountDownLatch().new MyWork("Thread2",latch)).start();
new Thread(new MyCountDownLatch().new MyWork("Thread3",latch)).start();
// 等待3个线程执行完成
latch.await();
System.out.println("All works are done.");
} /**
* 线程任务
* @author coshaho
*/
private class MyWork implements Runnable
{
private String workName;
private CountDownLatch latch;
public MyWork(String workName, CountDownLatch latch)
{
this.workName = workName;
this.latch = latch;
} @Override
public void run()
{
try
{
System.out.println("Thread " + workName + " is running.");
Thread.sleep(1000);
System.out.println("Thread " + workName + " is stop.");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
finally
{
// 线程执行完成,线程等待变量减少
latch.countDown();
}
}
}
}
运行结果如下:
Thread Thread1 is running.
Thread Thread3 is running.
Thread Thread2 is running.
Thread Thread1 is stop.
Thread Thread3 is stop.
Thread Thread2 is stop.
All works are done.
线程等待——CountDownLatch使用的更多相关文章
- Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行
Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行 Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执 ...
- Java多线程-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier
Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁 ...
- 线程协作-CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作.
- 线程同步器CountDownLatch
Java程序有的时候在主线程中会创建多个线程去执行任务,然后在主线程执行完毕之前,把所有线程的任务进行汇总,以前可以用线程的join方法,但是这个方法不够灵活,我们可以使用CountDownLatch ...
- SQL之收集SQL Server线程等待信息
要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...
- 对线程等待函数pthread_join二级指针参数分析
分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地 ...
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- java 多线程—— 线程等待与唤醒
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- 收集SQLServer线程等待信息
要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...
随机推荐
- [通信] C# TCP实现多个客户端与服务端 数据 与 文件的传输
说明: http://download.csdn.net/detail/chwei_cson/4423874 源码: http://download.csdn.net/download/meicanj ...
- Android加载asset的db
extends:http://blog.csdn.net/lihenair/article/details/21232887 项目需要将预先处理的db文件加载到数据库中,然后读取其中的信息并显示 加载 ...
- MySQL的btree索引和hash索引的区别 (转)
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...
- Redis学习资料整理
Redis学习资料: (1)Redis设计与实现 (2)十五分钟介绍 Redis数据结构 (3)redis安装 (4)redis指令手册中文版 Hiredis学习资料: (1)hiredis安装及测试 ...
- SSH教程从零打造在线网盘系统前言&目录
本系列教程内容提要 本系列教程是一个学习教程,是关于Java工程师的SSH(Struts2+Spring+Hibernate)系列教程,本教程将会分为四个部分和大家一同打造一个在线网盘系统,由于教程是 ...
- Centos7.2修改时区
设置时区同样, 在 CentOS 7 中, 引入了一个叫 timedatectl 的设置设置程序. 用法很简单: # timedatectl # 查看系统时间方面的各种状态 Local time: 四 ...
- OpenCV学习笔记之课后习题练习4-1
第四章课后练习1 1.本章完整讲述了基本的输入/输出编程以及OpenCV的数据结构.下面的练习是基于前面的知识做一些应用,为后面大程序的实现提供帮助.a.创建一个程序实现以下功能:(1)从视频文件中读 ...
- HDU 6441 - Find Integer - [费马大定理][2018CCPC网络选拔赛第4题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6441 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- HTML 标签大全及属性
基本结构标签: <HTML>,表示该文件为HTML文件 <HEAD>,包含文件的标题,使用的脚本,样式定义等 <TITLE>---</TITLE>,包含 ...
- HTML_css选择器
第二种增加css样式的方法,可以在head中增加style标签,style中通过选择器定位标签增加css样式 CSS选择器分为六种: 1.id选择器 2.class选择器 3.标签选择器 4. ...