我们工作中会用各种池,线程池,数据库连接池,http连接池,
那为什么用池化技术呢?
答案很明显,肯定是有好处呗,具体有什么好处,
我们举个例子验证一下,大家看看执行结果说话,有代码,有图,才有真相
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
for (int i = 1; i < 6; i++) {
excute();
System.out.println("---------------第" + i + "次执行结束---------------");
}
}
private static void excute() throws InterruptedException {
Long noPoolStartTime = System.currentTimeMillis();
final List<Integer> list = new ArrayList<>();
final Random random = new Random();
for (int i = 0; i < 10000; i++) {
Thread thread = new Thread() {
@Override
public void run() {
list.add(random.nextInt());
}
};
thread.start();
thread.join();
}
System.out.println("list长度为:" + list.size());
System.out.println("不使用线程池运行时间为:" + (System.currentTimeMillis() - noPoolStartTime));
Long threadPoolStartTime = System.currentTimeMillis();
final List<Integer> poolList = new ArrayList<>();
// ExecutorService executorService = Executors.newSingleThreadExecutor();//开发手册不建议这样写,因为LinkedBlockingQueue为无界队列
ExecutorService executorService = new ThreadPoolExecutor(1,
1,
0,
TimeUnit.MILLISECONDS, /*new SynchronousQueue()*/
new ArrayBlockingQueue<>(10000));
for (int i = 0; i < 10000; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
poolList.add(random.nextInt());
}
});
}
executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.DAYS);
System.out.println("poolList长度为:" + poolList.size());
System.out.println("使用线程池后运行时间为:" + (System.currentTimeMillis() - threadPoolStartTime));
}
}
执行结果如下:
list长度为:10000
不使用线程池运行时间为:2200
poolList长度为:10000
使用线程池后运行时间为:41
---------------第1次执行结束---------------
list长度为:10000
不使用线程池运行时间为:1197
poolList长度为:10000
使用线程池后运行时间为:16
---------------第2次执行结束---------------
list长度为:10000
不使用线程池运行时间为:969
poolList长度为:10000
使用线程池后运行时间为:7
---------------第3次执行结束---------------
list长度为:10000
不使用线程池运行时间为:1023
poolList长度为:10000
使用线程池后运行时间为:5
---------------第4次执行结束---------------
list长度为:10000
不使用线程池运行时间为:954
poolList长度为:10000
使用线程池后运行时间为:4
---------------第5次执行结束---------------
由此可见线程池确实能提高效率,有这么好的技术何乐而不用呢?