告警性能优化过程中,遇到如下问题: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使用的更多相关文章

  1. Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行

    Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行 Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执 ...

  2. Java多线程-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier

    Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁 ...

  3. 线程协作-CountDownLatch

    CountDownLatch允许一个或多个线程等待其他线程完成操作.

  4. 线程同步器CountDownLatch

    Java程序有的时候在主线程中会创建多个线程去执行任务,然后在主线程执行完毕之前,把所有线程的任务进行汇总,以前可以用线程的join方法,但是这个方法不够灵活,我们可以使用CountDownLatch ...

  5. SQL之收集SQL Server线程等待信息

    要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...

  6. 对线程等待函数pthread_join二级指针参数分析

    分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地 ...

  7. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  8. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  9. 收集SQLServer线程等待信息

    要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...

随机推荐

  1. windows下的zookeeper安装

    先在官网下载安装包(https://www.apache.org/dyn/closer.cgi/zookeeper/),单机安装非常简单,只要获取到 Zookeeper 的压缩包并解压到某个目录如:C ...

  2. POJ_1050_To the Max

    To the Max Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 49811   Accepted: 26400 Desc ...

  3. flask_SQLAlchemy常用数据类型及列选项

    SQLAlchemy常用数据类型:1. Integer:整形,映射到数据库中是int类型.2. Float:浮点类型,映射到数据库中是float类型.他占据的32位.3. Double:双精度浮点类型 ...

  4. 【转】基于jquery,bootstrap数据验证插件bootstrapValidator 教程

    bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...

  5. AndroidStudio自定义TODO

    1.增加自定义TODO标记 Preferences -> Editor -> TODO,然后点击左下角的加号,输入想要自定义的TODO的正则 输入\bX\b.*(X为TODO标签的名字), ...

  6. 在linux下使用sqlcmd

    1.curl https://packages.microsoft.com/config/rhel/6/prod.repo > /etc/yum.repos.d/mssql-release.re ...

  7. 002-redis-数据类型

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). 使用桌面工具查看,默认有16个库,Redis支持多 ...

  8. 【剑指offer】包含min函数的栈

    一.题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数. 二.思路: 无,Z(zhi)Z(zhang)式操作. 三.代码:    

  9. SQLite-创建、附加、分离数据库

    创建数据库 - $> sqlite3 DatabaseName.db 附加数据库 - sqlite> ATTACH DATABASE 'DatabaseName.db' AS 'Alias ...

  10. bootstrap modal插件弹出窗口如何限制最大高度,并且在内容过多时可以滚动显示

    .modal-body{ max-height:400px; overflow-y:auto; } 只有在modal-body类上限制高度才能起作用,其他地方的限制均不起作用