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的弊端执行 ...
随机推荐
- Wcf简单实例1
一.客户端添加服务引用,并调用 1.使用客户端代理同步调用 static void TestTwo() { /*********同步访问********/ Person.PersonServiceCl ...
- VS2010发布网站的基本步骤
1.首先建一个空文件夹,用来存放发布的程序:例如:WebTest 2.然后打开IIS--->右击--->添加网站,如下图所示: 图 1-1 ...
- 搭建maven项目简介
http://jingyan.baidu.com/album/9f7e7ec0b714ae6f29155465.html?picindex=1 Maven学习 (一) 搭建Maven环境 http:/ ...
- Starting nagios:This account is currently not available nagios
nagios在启动时报错 # service nagios restartRunning configuration check…done.Stopping nagios: done.Starting ...
- Zend Framework
参考:http://www.php100.com/manual/ZendFramework/index.html 1.1. 概述 Zend Framework (ZF) 是一个开放源代码的 PHP5 ...
- MFC 全局配置 读取保存配置
不知道关于全局配置别人都是怎么处理的,最近做的东西都用到全局配置,而且要保存软件的设置,下次启动时要使用上次关闭时的配置. 我的做法是建一个类用来保存和读取配置,并且在这个类中创建一些变量,供所有的界 ...
- java事件处理2
Document事件 这个事件有点特别,需要用getDocument()返回到自己所维护的文档,然后就可以添加监视器 (textArea1.getDocument).addDocumentListen ...
- 《Linux内核分析》 week6作业-Linux内核fork()系统调用的创建过程
一.进程控制块PCB-stack_struct 进程在操作系统中都有一个结构,用于表示这个进程.这就是进程控制块(PCB),在Linux中具体实现是task_struct数据结构,它主要记录了以下信息 ...
- A Linear Time Majority Vote Algorithm
介绍一种算法,它可以在线性时间和常数空间内,在一个数组内找出出现次数超过一半的某个数字. 要解决这个问题并不难,可以使用排序或哈希,但是这两种算法都不能同时满足时间或空间的要求. 然而,该算法(A L ...
- CSS3+HTML5学习笔记(1)
box内阴影: -moz-box-shadow:inset 30px #; -webkit-box-shadow:inset 30px #; box-shadow:inset 30px #; 多重文字 ...