最近在做一个查询优化时,考虑到一次查询耗时较多,所以打算用多线程来做,之前是串行查询。比如一个用户查询触发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 }
线程执行体

相关文章: