线程等待——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.
时间: 2024-10-08 10:17:12

线程等待——CountDownLatch使用的相关文章

线程:CountDownLatch同步工具

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 类似计数器,当计数器的值为0时,继续往下执行. 1 package ch03; 2 3 import java.util.Random; 4 import java.util.concurrent.CountDownLatch; 5 import java.util.concurrent.ExecutorService; 6 import java.util.concurrent.Executors; 7 8

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

分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地址.一级指针承接的话就是这个地址. 那既然二级指针保存了,我们如何访问那?开始我觉得直接来个二级指针,然后*访问算了,但是下面的东西.让你不能那么干了!其实非要那样也可以 malloc呗! 线程创建函数pthread_create的函数原型如下: int pthread_create(pthread

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

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 概述 第1部分 wait(), notify(), notifyAll()等方法介绍 第2部分 wait()和notify()示例 第3部分 wait(long timeout)和notify() 第4部分 wait() 和 notifyAll() 第5部分 

SQL点滴13—收集SQLServer线程等待信息

原文:SQL点滴13-收集SQLServer线程等待信息 要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_stats 这是一个系统视图,里面存储线程所遇到的所有的等待信息,具体的列如下表 列名 数据类型 说明 Wait_type Nvarchar(60) 等待类型名称 waiting_tasks_count Bigint 等待类型的等待数.该计数

GCD线程依赖,GCD队列组,线程监听,线程等待

1.线程监听 有时候经常有这样的需求,AB任务都执行完成之后,刷新界面或者执行其他操作, /** * 队列组 dispatch_group_notify */ - (void)groupNotify { NSLog(@"begin"); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORIT

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

转自:https://www.cnblogs.com/skywang12345/p/3479224.html  (含部分修改) 概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括: wait(), notify(), notifyAll()等方法介绍 wait()和notify() wait(long timeout)和notify() wait() 和 notifyAll() 为什么notify(), wait()等函数定义在Object中,而不是Thread中 一. wait(),

c/c++ 多线程 多个线程等待同一个线程的一次性事件

多线程 多个线程等待一个线程的一次性事件 背景:从多个线程访问同一个std::future,也就是多个线程都在等待同一个线程的结果,这时怎么处理. 办法:由于std::future只能被调用一次get方法,也就是只能被某一个线程等待(同步)一次,不支持被多个线程等待.所以std::sharted_future,就应运而生了. 特点:std::sharted_future可以被复制,std::future是不可以的被复制的. std::sharted_future的3种创建方式(fut为std::

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

Semaphore控制同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可. Semaphore控制同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可. Semaphore控制同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可. 原文地址:https://www.cnblogs.com/panxuejun/p/86

Java中线程等待(同步)的五种方法

在面试时,经常会有面试官问道,一个主线程有多个子线程,如何能使子线程的业务执行完成之后,再执行主线程业务逻辑.对于这个问题,本人能够想到的有五种方法,详细请移步源码 1.使用线程类自带的join方法,将子线程加入到主线程,在子线程执行完之后,在执行主线程逻辑. 例如 public static void joinDemo() throws InterruptedException { System.out.println("=========Test with join=====");