lesson7:java线程池
在jdk1.5的版本中,java提供了语言级别的线程池,对于需要使用线程池的业务系统和中间件框架等提供了方便的选择。我认为线程池主要有两个方面的作用:第一就是防止因为外部条件的变化,造成线程数的瞬间飙升,从而影响了正常的业务使用;第二就是提高线程的利用率,从而在性能上带来好处,例如在NIO模型中,工作线程池中只用了很少的线程,但却可以服务大量的连接。
demo源码:https://github.com/mantuliu/javaAdvance
网上有很多介绍线程池的文章,在这里我就不讲线程池的细节了,只围绕线程池的两个特性,用实际的案例来解释分析。之前我在工作中遇到过一个因为网络中断而引起的生产事故,整个jvm的资源都被都被业务线程耗光的情况。场景是这样的:在某些预约挂号业务里,客户发起了一笔挂号业务,需要把下单请求提交到医院的,在医院返回挂号成功后,才算一个业务的完结,但是由于生产环境的网络到某家医院的网络断了,最后就造成了因为一家医院的网络问题,整个服务的资源都被耗光的情况,服务直接停服了。
下面的两个demo模拟展示了因为线程在一定时间内不能释放,线程数急速增加,从而停服的情况:
demo Lesson7ThreadsOnly 模拟展示了因为一家医院的网络问题造成整个服务的线程数量飙升,并且服务停服的情况;
demo Lesson7ThreadPool 模拟展示了在使用线程池的情况下,就算某家医院因为网络问题使得它自己的线程池满负荷运行,但是却不会对其它医院的业务造成影响;
关于线程池提升性能,在不同的场景下提升的性能比率是不同的,以我下面的两个demo为例,因为核心业务执行的操作非常简单,所以性能的对比差异非常大,在1分钟内,使用纯线程的方式创建的订单数为:731560;而使用线程池的方式创建的订单数为:77674078,性能提升达到了100倍。
demo Lesson7ThreadsPerform 使用纯线程的方式进行下单操作,每笔订单都需要一个新线程来完成;
demo Lesson7ThreadPoolPerform 使用线程池的方式进行下单操作,每笔订单都只是被线程池中的某个线程作为一个任务来执行。
通过本文的4个demo像大家展示了线程池了两个主要功用:1是防止线程飙升,保护服务正常运行;2是提升性能。
lesson7:java线程池的更多相关文章
- Java 线程池框架核心代码分析--转
原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...
- Java线程池使用说明
Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...
- (转载)JAVA线程池管理
平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...
- Java线程池的那些事
熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...
- 四种Java线程池用法解析
本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...
- Java线程池的几种实现 及 常见问题讲解
工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能 ...
- Java线程池应用
Executors工具类用于创建Java线程池和定时器. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThread ...
- Java线程池的原理及几类线程池的介绍
刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...
- Java线程池与java.util.concurrent
Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行 ...
随机推荐
- css动画+照片清晰度动画
源代码: <!DOCTYPE html><html><head> <title>donghua</title> <meta chars ...
- requirejs和r.js的心得
requirejs的GitHub:requirejs r.js的GitHub:r.js grunt-contrib-requirejs的GitHub:grunt-contrib-requirejs r ...
- C#获取磁盘列表与信息
方法1:使用Environment //获取当前计算机逻辑磁盘名称列表 String[] drives = Environment.GetLogicalDrives(); Console.WriteL ...
- 如何完全卸载SQL Server 2005
用过SQL Server 2005的朋友都应该知道,不管是安装还是完全卸载都是件很头疼的事情. 下面跟大家分享一下如何完全卸载SQL Server 2005(手动卸载步骤哦~~). 一.停止sql的服 ...
- HADOOP报错Incompatible namespaceIDs
出现这个问题的原因是因为namespaceIDs导致的 解决方案1<推荐> 1. 进入链接不上的从机 stop-all.sh关闭hadoop 2. 编辑namespaceID,路径是< ...
- 分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)
BOOL型变量:if(!var) int型变量: if(var==0) float型变量: const float EPSINON = 0.00001; if ((x > ...
- 正则表达式中/g的含义
关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?” 为了解答“正则表达式(/[^0-9]/g,'')中的" ...
- TagHelper
TagHelper是怎么实现的 众所周知,在asp.net core中编写Razor视图的时候,用了一种新的写法--TagHelper 那这个TagHelper是怎么回事呢? 首先来看看TagHe ...
- Android Recovery的汉化 显示中文
Android Recovery的汉化 显示中文,有需要的朋友可以参考下. 首先下载开源的recovery源码,地址为https://github.com/xiaolu/android_bootabl ...
- 转:浅析基于微软SQL Server 2012 Parallel Data Warehouse的大数据解决方案
综述 随着越来越多的组织的数据从GB.TB级迈向PB级,标志着整个社会的信息化水平正在迈入新的时代 – 大数据时代.对海量数据的处理.分析能力,日益成为组织在这个时代决胜未来的关键因素,而基于大数据的 ...