Java中的对象是使用new操作符创建的,如果创建大量短生命周期的对象,这种方式性能非常低下。为了解决这个问题,而发明了池技术。

对于数据库连接有连接池,对于线程则有线程池。

本实例介绍两种方式创建1000个短生命周期的线程,第一种是普通方式,第二种是线程池的方式。通过时间和内存消耗的对比,就可以很明显地看出线程池的优势。

实例结果如下:

说明:使用线程池创建对象的时间是15毫秒,说明线程池是非常高效的。

关键技术:

Executors类为java.util.concurrent包中所定义的Executor、ExecutorService、ScheduleExecutorService、ThreadFactory和Callable类提供工厂方法和实用方法。该类支持以下各种方法:

(a)创建并返回设置有常用配置字符串的ExecutorService方法。

(b)创建并返回设置有常用配置字符串的ScheduleService方法。

(c)创建并返回“包装的”ExecutorService方法,它通过使特定于实现的方法不可访问来禁用 重新配置。

(d)创建并返回ThreadFactory方法,它可以将创建的线程设置为已知的状态。

(e)创建并返回非闭包形式的Callable方法,这样可将其用于需要Callable的执行方法中。

本实例使用newFixedThreadPool()方法,创建一个可重用固定线程数的线程池,它以共享的无界队列方式来运行这些线程。该方法的声明如下:

public static ExecutorService newFixedThreadPool(int nThreads)

参数说明: nThreads为池中的线程池。

设计过程:

1)编写类TempThread,该类实现了Runnable接口。在run()方法中,进行简单的自增运算,代码如下:

public class TempThread implements Runnable {// 测试用的Runnable接口实现类private int id = 0;@Overridepublic void run() {// run()方法给id做自增运算id++;}
}

2)编写类ThreadPoolTest进行测试,在main()方法中,使用两种方式创建1000个线程,分别输出了创建时间和占用的内存。代码如下:

</pre><pre class="java" name="code">import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolTest {public static void main(String[] args) {Runtime run = Runtime.getRuntime();// 创建Runtime对象run.gc();// 运行垃圾回收器,这样可以减少误差long freeMemory = run.freeMemory();// 获得当前虚拟机的空闲内存long currentTime = System.currentTimeMillis();// 获得当前虚拟机的时间for (int i = 0; i < 10000; i++) {// 独立运行1000个线程new Thread(new TempThread()).start();}System.out.println("独立运行1000个线程所占用的内存:" + (freeMemory - run.freeMemory()) + "字节");// 查看内存的变化System.out.println("独立创建1000个线程所消耗的时间:" + (System.currentTimeMillis() - currentTime) + "毫秒");// 查看时间的变化run.gc();// 运行垃圾回收器freeMemory = run.freeMemory();// 获得当前虚拟机的空闲内存currentTime = System.currentTimeMillis();// 获得当前虚拟机的时间ExecutorService executorService = Executors.newFixedThreadPool(2);// 创建线程池for (int i = 0; i < 1000; i++) {// 使用线程池运行1000个线程executorService.submit(new TempThread());}System.out.println("使用连接池运行1000个线程所占用的内存:" + (freeMemory - run.freeMemory()) + "字节");// 查看内存的变化System.out.println("使用连接池创建1000个线程所消耗的时间:" + (System.currentTimeMillis() - currentTime) + "毫秒");// 查看时间的变化}
}

注意:在使用完线程池后,需要调用ExecutorService接口中定义的shutdownNow()方法,来终止线程池。

使用线程池优化多线程编程相关推荐

  1. ThreadPoolExecutor详解及线程池优化

    前言 ThreadPoolExecutor在concurrent包下,是我们最常用的类之一.无论是做大数据的,还是写业务开发,对其透彻的理解以及如何发挥更好的性能,成为了我们在更好的coding道路上 ...

  2. 通过ThreadPoolExecutor与ForkJoinPool比较,分别对比其execute ,submit 等方法提交线程池任务的区别,来深入理解线程池及并发编程

    前言 以前使用线程池,对execute . submit 等方法提交线程池任务的区别比较模糊,现在通过ThreadPoolExecutor与ForkJoinPool比较,分别对比其execute ,s ...

  3. 【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

      springboot篇章整体栏目:  [一]springboot整合swagger(超详细 [二]springboot整合swagger(自定义)(超详细) [三]springboot整合toke ...

  4. 线程池 c linux 编程,关于c++:linux-c编程之高效线程池如何实现无琐化

    大多数线程池实现都离不开锁的应用,如互斥量pthread_mutex*联合条件变量pthread_cond*.家喻户晓,锁的应用对于程序性能影响较大,尽管现有的pthread_mutex*在锁的申请与 ...

  5. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  6. linux posix 线程池_linux多线程--POSIX Threads Programming

    linux多线程自己从接触很久也有不少实践,但总是觉得理解不够深刻,不够系统.借这篇文章试着再次系统学习一下linux多线程编程,理解编程的concept,细致看一下POSIX pthread API ...

  7. c++ socket线程池_java 网络编程,Socket编程

    Java的网络编程主要涉及到的内容是Socket编程,那么什么是Socket呢?简单地说,Socket,套接字,就是两台主机之间逻辑连接的端点.TPC/IP协议是传输层协议,主要解决数据如何在网络中传 ...

  8. java线程池_Java 并发编程 线程池源码实战

    作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...

  9. c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析

    前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程.在看源码的时候,首先带着以下两个问题去仔细阅读.一是线程池如何保证核心线程数不会被销毁,空闲线程数 ...

最新文章

  1. dac生成信号频率取决于_DAC和AOC,谁将是数据通信领域最终赢家?
  2. 多传感器融合技术简介
  3. 在线看板Leangoo实践
  4. java 处理byte_java - 文件到Java中的byte [] - 堆栈内存溢出
  5. linux电脑培训,电脑培训Linux服务器初始化Shell
  6. mysql外键约束分数_MySQL提高(外键约束)
  7. 电商营销方式抢购,秒杀Redis原子减decr方法作为剩余库存判断条件的实现方式(1)
  8. 论文阅读笔记|Unsuperised Deep Homography
  9. 腾创秒会达视频会议系统软件 安卓
  10. linux加静态路由命令,LINUX添加静态路由
  11. 有钱就能赞助FIFA世界杯?NO!看雅迪电动车的全球征程
  12. 期末总结---为本学期画上圆满的句号
  13. 已解决_mssql.MSSQLDatabaseException: (2627, b“Violation of PRIMARY KEY constraint ‘PK__TM_DATA___7BDCF2
  14. 静态库与动态库(共享库)的联系与区别
  15. 恶心的英特尔的RST驱动
  16. NIR近红外光谱简介
  17. Python里的阻塞队列
  18. android 入门学习笔记 BIG5 与 UTF-8互转
  19. 一个星期快速自学java编程高级语言干货笔记 -实用类
  20. 深度学习分类类别不平衡_如何应对深度学习中的数据分布不平衡问题

热门文章

  1. 敏捷迭代管理 --工时估算(估点)
  2. 支持三个cpu的服务器,产品技术-新华三发布搭载英特尔第三代可扩展处理器的H3C UniServer R6900 G5 服务器-新华三集团-H3C...
  3. OCP-1Z0-051 第61题 where通配符
  4. C/C++ 中三块难啃的硬骨头
  5. 云视通服务器关闭,云视通服务器连接成功,但数据失败
  6. asp.net mysql 连接池_asp.net 使用数据库连接池
  7. java角谷_java实现递归设计——数鸭子和角谷定理
  8. 计算机保护分区,磁盘显示为GPT(保护分区)
  9. oj. 1008——最长公共子序列
  10. 谢国忠:下一场金融风暴将在6月左右开始