一种父线程阻塞等待子线程的有效方法
最近在做一个查询优化时,考虑到一次查询耗时较多,所以打算用多线程来做,之前是串行查询。比如一个用户查询触发50个线程,在只有一个用户的情况下,性能比串行查询确实提高了许多,但当多个用户同时触发查询的时候,CPU却飙高得很厉害,比串行查询好不了多少。
因为一次查询是同步查询,即要等待所有的线程完成后才返回结果,所以一开始想到的办法是每次查询都起一个线程池,这个线程池里面有50个线程,这个线程池阻塞等待所有的线程完成然后返回结果,从而造成50个用户同时查询时起了50个线程池,cpu资源消耗殆尽。能不能做到所用用户查询触发的线程统一由一个线程池控制呢?百度后终于找到了解决办法。
![](/assets/blank.gif)
![](/assets/blank.gif)
1 import java.util.concurrent.CountDownLatch; 2 3 public class ThreadA implements Runnable { 4 5 private CountDownLatch cDownLatch; 6 7 private String name; 8 9 public ThreadA(CountDownLatch cDownLatch, String threadName) { 10 this.cDownLatch = cDownLatch; 11 this.name = threadName; 12 } 13 14 @Override 15 public void run() { 16 System.out.println(name + " begin."); 17 try { 18 Thread.sleep(500); 19 } catch (InterruptedException e) { 20 e.printStackTrace(); 21 } 22 System.out.println(name + " end."); 23 cDownLatch.countDown(); 24 } 25 }
线程执行体
![](/assets/blank.gif)
![](/assets/blank.gif)
1 import java.util.concurrent.BlockingQueue; 2 import java.util.concurrent.LinkedBlockingQueue; 3 import java.util.concurrent.ThreadPoolExecutor; 4 import java.util.concurrent.TimeUnit; 5 6 public class MyThreadPool extends ThreadPoolExecutor { 7 8 private static MyThreadPool myPool = new MyThreadPool(10, 100, 1, 9 TimeUnit.DAYS, new LinkedBlockingQueue<Runnable>()); 10 11 private MyThreadPool(int corePoolSize, int maximumPoolSize, 12 long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { 13 super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); 14 } 15 16 public static MyThreadPool getInstance() { 17 return myPool; 18 } 19 }
线程池
![](/assets/blank.gif)
![](/assets/blank.gif)
import java.util.concurrent.CountDownLatch;public class MainThread {public static void main(String[] args) {ThreadExecutor executor = new ThreadExecutor("A", 3);executor.execute();} }class ThreadExecutor {private String prefix;private int size;public ThreadExecutor(String prefix, int size) {this.prefix = prefix;this.size = size;}public void execute() {System.out.println(prefix + " begin.");ThreadA temp = null;CountDownLatch cDownLatch = new CountDownLatch(size);for (int i = 0; i < size; i++) {temp = new ThreadA(cDownLatch, prefix + i);MyThreadPool.getInstance().execute(temp);}try {cDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(prefix + " end.");} }
主线程
执行结果
A begin.
A0 begin.
A1 begin.
A2 begin.
A1 end.
A0 end.
A2 end.
A end.
转载于:https://www.cnblogs.com/BensonHe/p/3150516.html
一种父线程阻塞等待子线程的有效方法相关推荐
- 如何实现java主线程等待子线程执行完毕之后再执行?
本文转自:问题:如何实现java主线程等待子线程执行完毕之后再执行? - jseven - 博客园 点击关注强哥,查看更多精彩文章呀 工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完 ...
- 日积月累:Java等待子线程执行完毕,再执行后续逻辑
在实际开发过过程中,我们会经常遇见将一个"庞大"的任务拆分成多个子任务,各个子任务在独立的子线程中运行.待所有子线程的任务完成之后,在运行后续的业务,或者退出Main线程.代码如下 ...
- pthread_detach():主线程与子线程分离,子线程结束后,资源自动回收
https://github.com/Rtoax/test/tree/master/c/glibc/pthread 目录 前言 pthread_join() pthread_detach() 前言 1 ...
- 【多线程】学习记录七种主线程等待子线程结束之后在执行的方法
最近遇到一个问题需要主线程等待所有的子线程结束,才能开始执行,统计所有的子线程执行结果,返回,网上翻阅各种资料,最后记录一下,找到七种方案 第一种:while循环 对于"等待所有的子线程结束 ...
- Java如何等待子线程执行结束
参考:http://www.jiacheo.org/blog/262 工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了 ...
- java 线程执行结束_Java_如何等待子线程执行结束
本程序的数据有可能是如下: main thread work start sub thread start working. main thread work done. now waiting su ...
- java 主线程等待_Java实现主线程等待子线程
本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...
- c++ 等待子线程结束_python主线程与子线程的结束顺序
对于程序来说,如果主进程在子进程还未结束时就已经退出,那么Linux内核会将子进程的父进程ID改为1(也就是init进程),当子进程结束后会由init进程来回收该子进程. 主线程退出后子线程的状态依赖 ...
- Thread:主线程等待子线程执行完毕再执行解决办法
线程从启动到执行完毕,一般会有一些耗时操作,并不能像一般的程序语句,就能立马结束.如下代码: package com.xxx.async; public class WaitThreadDone {p ...
最新文章
- firewall-cmd命令管理防火墙
- 互联网1分钟 |0102
- 电子计算机职业40201,天津滨海中等专业学校
- ES6展开运算符(...)
- LeetCode 414. Third Maximum Number
- Android——Android Studio导入SlidingMenu类库的方法
- hype-v的磁盘管理(转换)
- 第一台通用计算机它的名字叫做什么,第一台计算机叫什么名字
- 哈夫曼思维导图,第六章前半段思维导图
- 〖工具〗Ladon 9.1.1 CobaltStrike神龙插件发布
- 使用SecOC打造的CAN网络依旧很不安全
- 吴伯凡-认知方法论-T字形认知
- RabbitMQ使用教程(超详细)
- 克隆硬盘后进不去系统_Win10怎么快速复制磁盘或克隆磁盘到另一个磁盘上 - 分区助手教程...
- android11 前摄相头隐藏闪光灯图标
- DX11 游戏开发笔记 (一) 资源介绍
- 微信小程序 常用组件
- STM32L0 内部EEPROM写读
- 【BZOJ1067】【SCOI2007】降雨量
- edge 禁止网页自动刷新_如何在Microsoft Edge中自动翻译网页
热门文章
- android 网易item广告,Android仿网易严选商品详情页
- python初体验-hello world答案_Python初体验_基础(一)
- redhat linux7.0的安装
- Eclipse生成jar包
- 管理员以标准权限运行时
- Windows在安装builtwith时遇到问题
- 160 - 35 cupofcoffe.1
- 160 - 18 Brad Soblesky.1
- 【C++grammar】代理构造、不可变对象、静态成员
- Scala中的do ... while循环