最近在做一个查询优化时,考虑到一次查询耗时较多,所以打算用多线程来做,之前是串行查询。比如一个用户查询触发50个线程,在只有一个用户的情况下,性能比串行查询确实提高了许多,但当多个用户同时触发查询的时候,CPU却飙高得很厉害,比串行查询好不了多少。

因为一次查询是同步查询,即要等待所有的线程完成后才返回结果,所以一开始想到的办法是每次查询都起一个线程池,这个线程池里面有50个线程,这个线程池阻塞等待所有的线程完成然后返回结果,从而造成50个用户同时查询时起了50个线程池,cpu资源消耗殆尽。能不能做到所用用户查询触发的线程统一由一个线程池控制呢?百度后终于找到了解决办法。

 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 }

线程执行体

 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 }

线程池

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

一种父线程阻塞等待子线程的有效方法相关推荐

  1. 如何实现java主线程等待子线程执行完毕之后再执行?

    本文转自:问题:如何实现java主线程等待子线程执行完毕之后再执行? - jseven - 博客园 点击关注强哥,查看更多精彩文章呀 工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完 ...

  2. 日积月累:Java等待子线程执行完毕,再执行后续逻辑

    在实际开发过过程中,我们会经常遇见将一个"庞大"的任务拆分成多个子任务,各个子任务在独立的子线程中运行.待所有子线程的任务完成之后,在运行后续的业务,或者退出Main线程.代码如下 ...

  3. pthread_detach():主线程与子线程分离,子线程结束后,资源自动回收

    https://github.com/Rtoax/test/tree/master/c/glibc/pthread 目录 前言 pthread_join() pthread_detach() 前言 1 ...

  4. 【多线程】学习记录七种主线程等待子线程结束之后在执行的方法

    最近遇到一个问题需要主线程等待所有的子线程结束,才能开始执行,统计所有的子线程执行结果,返回,网上翻阅各种资料,最后记录一下,找到七种方案 第一种:while循环 对于"等待所有的子线程结束 ...

  5. Java如何等待子线程执行结束

    参考:http://www.jiacheo.org/blog/262 工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了 ...

  6. java 线程执行结束_Java_如何等待子线程执行结束

    本程序的数据有可能是如下: main thread work start sub thread start working. main thread work done. now waiting su ...

  7. java 主线程等待_Java实现主线程等待子线程

    本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...

  8. c++ 等待子线程结束_python主线程与子线程的结束顺序

    对于程序来说,如果主进程在子进程还未结束时就已经退出,那么Linux内核会将子进程的父进程ID改为1(也就是init进程),当子进程结束后会由init进程来回收该子进程. 主线程退出后子线程的状态依赖 ...

  9. Thread:主线程等待子线程执行完毕再执行解决办法

    线程从启动到执行完毕,一般会有一些耗时操作,并不能像一般的程序语句,就能立马结束.如下代码: package com.xxx.async; public class WaitThreadDone {p ...

最新文章

  1. firewall-cmd命令管理防火墙
  2. 互联网1分钟 |0102
  3. 电子计算机职业40201,天津滨海中等专业学校
  4. ES6展开运算符(...)
  5. LeetCode 414. Third Maximum Number
  6. Android——Android Studio导入SlidingMenu类库的方法
  7. hype-v的磁盘管理(转换)
  8. 第一台通用计算机它的名字叫做什么,第一台计算机叫什么名字
  9. 哈夫曼思维导图,第六章前半段思维导图
  10. 〖工具〗Ladon 9.1.1 CobaltStrike神龙插件发布
  11. 使用SecOC打造的CAN网络依旧很不安全
  12. 吴伯凡-认知方法论-T字形认知
  13. RabbitMQ使用教程(超详细)
  14. 克隆硬盘后进不去系统_Win10怎么快速复制磁盘或克隆磁盘到另一个磁盘上 - 分区助手教程...
  15. android11 前摄相头隐藏闪光灯图标
  16. DX11 游戏开发笔记 (一) 资源介绍
  17. 微信小程序 常用组件
  18. STM32L0 内部EEPROM写读
  19. 【BZOJ1067】【SCOI2007】降雨量
  20. edge 禁止网页自动刷新_如何在Microsoft Edge中自动翻译网页

热门文章

  1. android 网易item广告,Android仿网易严选商品详情页
  2. python初体验-hello world答案_Python初体验_基础(一)
  3. redhat linux7.0的安装
  4. Eclipse生成jar包
  5. 管理员以标准权限运行时
  6. Windows在安装builtwith时遇到问题
  7. 160 - 35 cupofcoffe.1
  8. 160 - 18 Brad Soblesky.1
  9. 【C++grammar】代理构造、不可变对象、静态成员
  10. Scala中的do ... while循环