(2)对象程池

(2.1)线程池概念

诸如web服务器、数据库服务器、文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务。构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象中为请求服务。但当有大量请求并发访问时,服务器不断的创建和销毁对象的开销很大。所以提高服务器效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这样就引入了“池”的概念,“池”的概念使得人们可以定制一定量的资源,然后对这些资源进行复用,而不是频繁的创建和销毁。

线程池是预先创建线程的一种技术。线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中。这些线程都是处于睡眠状态,即均为启动,不消耗CPU,而只是占用较小的内存空间。当请求到来之后,缓冲池给这次请求分配一个空闲线程,把请求传入此线程中运行,进行处理。当预先创建的线程都处于运行状态,即预制线程不够,线程池可以自由创建一定数量的新线程,用于处理更多的请求。当系统比较闲的时候,也可以通过移除一部分一直处于停用状态的线程。

(2.2)线程池作用

线程池作用就是限制系统中执行线程的数量。

根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。、

如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。

那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?

在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起

(2.3)为什么要用线程池

1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

个人补充:tomcat处理Http请求也是使用的线程池,如下图所示

2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。

(2.4)线程池核心类

比较重要的几个类:

ExecutorService

真正的线程池接口。(接口)

ScheduledExecutorService

能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。(接口)

ThreadPoolExecutor

ExecutorService的默认实现。(实现)

ScheduledThreadPoolExecutor

继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。(实现)

要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

1. new SingleThreadExecutor

创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

2.new FixedThreadPool

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

3. new CachedThreadPool

创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,

那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

4.new ScheduledThreadPool

java开源对象池,java 对象池 - 差不多先生的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...

  2. java记录类加载的个数_java类加载过程 - audience_1的个人空间 - OSCHINA - 中文开源技术交流社区...

    java类加载过程: 在我们代码中,一般就一个new的方法,就能够创建一个java的对象类,但在java虚拟机中 1:首先,我们需要判断该类是否已经在方法区中的常量池中有一个类的符号的引用存在,如果该 ...

  3. 创世神曲java倒闭了_javaIO基础 - 倒闭坑人走世界的个人空间 - OSCHINA - 中文开源技术交流社区...

    流是什么 简单的说:流是字节从源到目的地运行的轨迹. 次序是有意义的,字节会按照次序进行传递. 在java.io包中,有一些流是结点流,即它们可以从一个特定的地方读写. 列如磁盘或者一块内存.其它流称 ...

  4. java网络编程 听_java网络编程 - 亲亲媛的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.TCP/UDP,Socket,Http,Ftp简介 1.TCP/IP是个协议组(主要解决数据如何在网络中传输),可分为三个层次:网络层.传输层和应用层: 网络层:IP协议(支持网间互联的数据报协议 ...

  5. java io流拒绝访问_JAVA IO流 - 张宏良的个人空间 - OSCHINA - 中文开源技术交流社区...

    IO流 一.File类的使用 java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关 File能新建.删除.重命名文件和目录,但File不能访问文件内容本身.如果需要访问文件内容本身 ...

  6. java 写入环境变量_Java环境变量配置 - import_key的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java 环境变量和路径 在 Solaris 系统上,必须先设置 JAVA_HOME 和 PATH 环境变量,Sun Management Center 3.6 安装向导.设置向导和 Java 控制台 ...

  7. java 数组减除值_java数组操作 - osc_hwpd2zko的个人空间 - OSCHINA - 中文开源技术交流社区...

    什么是数组: 程序 = 算法+数据结构 算法:解决问题的步骤,流程(顺序,分支,循环) 数据结构:将数据按照某种特定的结构来保存 数怎么存 设计良好的,合理的数据结构可以导致好的算法 数组:就是一种最 ...

  8. java生成xml文件head,生成XML文件 - Glucose的个人空间 - OSCHINA - 中文开源技术交流社区...

    参照网上这篇博客所写,在此表示感谢 package com.qiux.demo; import java.io.FileOutputStream; import java.io.IOException ...

  9. java连连看项目汇报_java连连看小项目 - osc_x4wlt5vu的个人空间 - OSCHINA - 中文开源技术交流社区...

    /* *本人也是刚入门,希望各位多多指教 *该项目主要代码在于连线 *1.2个连线没有拐弯 *2.2个连线有一个拐弯 *3.2个连线有2个拐弯 *采用递归算法 */ package llk; impo ...

  10. linux rmi端口,RMI 两个端口 - 差不多先生的个人空间 - OSCHINA - 中文开源技术交流社区...

    在项目中使用rmi,发布到linux,unix,由于开了防火墙.需要配置防火墙端口.刚开始配置了一个固定端口,死都连接不通,后来同netstat -antup |grep pid 查看进程监听的端口, ...

最新文章

  1. 怎么才能最短时、高效、踏实地学习 Python(附链接)
  2. 在字符串中查找指定的字符串--strstr
  3. Linux系统查看位数和内存
  4. 人民邮电出版社图灵公司的两本SQL Server 2005图书诚征译者
  5. 一步步编写操作系统 56 门、调用门与RPL序 1
  6. 超轻简洁个人引导页网站源码
  7. Dockerfile创建pytorch1.1.0+cuda10.0+cudnn7.5踩过的坑
  8. python pyecharts 折线图_Python数据可视化之pyecharts实现各种图表
  9. Android类加载器和热修复原理
  10. centos6.5和centos7如何搭建php环境(包括php7)
  11. 什么是dispatchEvent?
  12. 编译原理完整学习笔记(八):目标代码生成
  13. mac使用Java命令运行Java程序
  14. ssm基于android的个人健康打卡系统APP-计算机毕业设计
  15. EPLAN中的edz文件的用法
  16. unity编辑器扩展篇-中文字段显示
  17. Gabor滤波器详解
  18. OpenFOAM 学习笔记
  19. 气味生意:躲得过老铁和网易云,但躲不过呼吸
  20. 188. 武士风度的牛

热门文章

  1. Atitit websocket 的前后端实现最佳实践t66 目录 1. 技术选型 1 2. 1.首先,在pom.xml引入如下jar包。Java-WebSocket-1.3.0.jar 1 3.
  2. Atitit 薪酬管理法 工作手册 员:薪酬管理办法 1.薪酬结构 所有员工的薪酬均由岗位工资、级别工资、校龄工资、特别津贴、绩效工资和季度奖金六部分组成。其中岗位工资、级别工资、校龄工资、22
  3. atitit.网络文件访问协议.unc smb nfs ftp http的区别
  4. paip.c#.net 多线程调用控件的问题
  5. paip.FTP服务架设选型
  6. paip.svn 导入项目到SVN库
  7. paip.提升用户体验----表格显示及控件布局错乱的问题
  8. paip.提升用户体验---提示语
  9. FLEX 24节气算法
  10. 钉钉机器人:python发送消息-加签模式