在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线程池的更多相关文章

  1. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  2. Java线程池使用说明

    Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...

  3. (转载)JAVA线程池管理

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...

  4. Java线程池的那些事

    熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...

  5. 四种Java线程池用法解析

    本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...

  6. Java线程池的几种实现 及 常见问题讲解

    工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能 ...

  7. Java线程池应用

    Executors工具类用于创建Java线程池和定时器. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThread ...

  8. Java线程池的原理及几类线程池的介绍

    刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...

  9. Java线程池与java.util.concurrent

    Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行 ...

随机推荐

  1. WIN7 64位上 MYSQL的ODBC一些个人理解

    最近电脑中毒了,无奈之下把32位的xp换成了64位的win7,无聊耗时的搭完开发环境,装了vs6.0(忽略掉一切的不兼容),装完64位的mysql(“mysql-5.6.10-winx64.zip”) ...

  2. HTML基础总结<标题>

      HTML: 标题 标题(Heading)是通过 <h1> - <h6> 等标签进行定义的. <h1> 定义最大的标题.<h6> 定义最小的标题. & ...

  3. ASP.NET中的MD5加密

    新人冒泡,打今起在园子里算是开博了,先来写点关于基础性的东西 为以后的写其他的文章做准备. 今天就先来说说MD5加密与在ASP.NET中如何实现MD5加密. MD5加密简单的说就是把一段明文 通过某种 ...

  4. ASP.NET实现省市区三级联动(局部刷新)

    跟前一篇ASP.NET实现年月日三级联动(局部刷新)一样,没什么技术含量,直接上代码 <asp:ScriptManager ID="ScriptManager1" runat ...

  5. XFire构建服务端Service的两种方式

    1.原声构建: 2.集成spring构建 http://blog.csdn.net/carefree31441/article/details/4000436XFire构建服务端Service的两种方 ...

  6. 如何删除Windows服务

    删除的办法有两个: 办法一: 用sc.exe这个Windows命令         开始——运行——cmd.exe,然后输入sc就可以看到了.使用办法很简单:         sc delete &q ...

  7. Windows 下 SVN 服务器配置

    1.下载文件,   下载最新版本subversion,我这里选择VisualSVN-Server-2.5.7.exe   2.安装Subversion 服务器   由于我下载的是setup.exe版本 ...

  8. Swift和OC混编时, 关于@objc的作用

    Objective-C 和 Swift 在底层使用的是两套完全不同的机制,Cocoa 中的 Objective-C 对象是基于运行时的,它从骨子里遵循了 KVC (Key-Value Coding,通 ...

  9. PHP FTP

    安装 PHP 的 Windows 版本内置了对 FTP 扩展的支持.无需加载任何附加扩展库即可使用 FTP 函数. 然而,如果您运行的是 PHP 的 Linux 版本,在编译 PHP 的时候请添加 - ...

  10. C#中从元数据

    元数据相对我们来说通俗点 就是你引用里面引用的那些dll比如 对Thread 按F12  不就是提示从元数据,..