使用线程池优化多线程编程
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()方法,来终止线程池。
使用线程池优化多线程编程相关推荐
- ThreadPoolExecutor详解及线程池优化
前言 ThreadPoolExecutor在concurrent包下,是我们最常用的类之一.无论是做大数据的,还是写业务开发,对其透彻的理解以及如何发挥更好的性能,成为了我们在更好的coding道路上 ...
- 通过ThreadPoolExecutor与ForkJoinPool比较,分别对比其execute ,submit 等方法提交线程池任务的区别,来深入理解线程池及并发编程
前言 以前使用线程池,对execute . submit 等方法提交线程池任务的区别比较模糊,现在通过ThreadPoolExecutor与ForkJoinPool比较,分别对比其execute ,s ...
- 【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据
springboot篇章整体栏目: [一]springboot整合swagger(超详细 [二]springboot整合swagger(自定义)(超详细) [三]springboot整合toke ...
- 线程池 c linux 编程,关于c++:linux-c编程之高效线程池如何实现无琐化
大多数线程池实现都离不开锁的应用,如互斥量pthread_mutex*联合条件变量pthread_cond*.家喻户晓,锁的应用对于程序性能影响较大,尽管现有的pthread_mutex*在锁的申请与 ...
- java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...
导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...
- linux posix 线程池_linux多线程--POSIX Threads Programming
linux多线程自己从接触很久也有不少实践,但总是觉得理解不够深刻,不够系统.借这篇文章试着再次系统学习一下linux多线程编程,理解编程的concept,细致看一下POSIX pthread API ...
- c++ socket线程池_java 网络编程,Socket编程
Java的网络编程主要涉及到的内容是Socket编程,那么什么是Socket呢?简单地说,Socket,套接字,就是两台主机之间逻辑连接的端点.TPC/IP协议是传输层协议,主要解决数据如何在网络中传 ...
- java线程池_Java 并发编程 线程池源码实战
作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...
- c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析
前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程.在看源码的时候,首先带着以下两个问题去仔细阅读.一是线程池如何保证核心线程数不会被销毁,空闲线程数 ...
最新文章
- dac生成信号频率取决于_DAC和AOC,谁将是数据通信领域最终赢家?
- 多传感器融合技术简介
- 在线看板Leangoo实践
- java 处理byte_java - 文件到Java中的byte [] - 堆栈内存溢出
- linux电脑培训,电脑培训Linux服务器初始化Shell
- mysql外键约束分数_MySQL提高(外键约束)
- 电商营销方式抢购,秒杀Redis原子减decr方法作为剩余库存判断条件的实现方式(1)
- 论文阅读笔记|Unsuperised Deep Homography
- 腾创秒会达视频会议系统软件 安卓
- linux加静态路由命令,LINUX添加静态路由
- 有钱就能赞助FIFA世界杯?NO!看雅迪电动车的全球征程
- 期末总结---为本学期画上圆满的句号
- 已解决_mssql.MSSQLDatabaseException: (2627, b“Violation of PRIMARY KEY constraint ‘PK__TM_DATA___7BDCF2
- 静态库与动态库(共享库)的联系与区别
- 恶心的英特尔的RST驱动
- NIR近红外光谱简介
- Python里的阻塞队列
- android 入门学习笔记 BIG5 与 UTF-8互转
- 一个星期快速自学java编程高级语言干货笔记 -实用类
- 深度学习分类类别不平衡_如何应对深度学习中的数据分布不平衡问题
热门文章
- 敏捷迭代管理 --工时估算(估点)
- 支持三个cpu的服务器,产品技术-新华三发布搭载英特尔第三代可扩展处理器的H3C UniServer R6900 G5 服务器-新华三集团-H3C...
- OCP-1Z0-051 第61题 where通配符
- C/C++ 中三块难啃的硬骨头
- 云视通服务器关闭,云视通服务器连接成功,但数据失败
- asp.net mysql 连接池_asp.net 使用数据库连接池
- java角谷_java实现递归设计——数鸭子和角谷定理
- 计算机保护分区,磁盘显示为GPT(保护分区)
- oj. 1008——最长公共子序列
- 谢国忠:下一场金融风暴将在6月左右开始