并发(2)--java线程池原理
来源:互联网 发布:linux启动jenkins 编辑:程序博客网 时间:2024/06/06 11:41
线程池Execotors工具可以创建普通的线程池以及schedule调度任务的调度池。使用线程池的一个优点就是:
1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。
2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。
线程池创建的方式是:
线程池的核心类
java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,可以来看下这个类:
从源码上我们看出了ThreadPoolExecutor继承了AbstractExecutorService类,并且有四个构造方法。
可以来具体分析下构造方法中每个参数的意义:
(1) corePoolSize:核心池的大小。创建池创建时,默认情况下线程池是没有线程池的,只有请求任务到来的时候才会创建线程来处理请求。但是我们可以通过调用prestartAllCoreThreads()或者prestartCoreThread()方法来预先创建线程,也就是即使没有任务也会创建corePoolSize个或者一个的线程,当线程池的数量达到了corePoolSize的时候,此时会把到达的任务放到缓冲队列中去。
(2) maximumPoolSize:线程池最大线程数
(3) keepAliveTime:线程在多久之后停止执行,这个时间是在当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,大于那部分线程,空闲时间达到了keepAliveTime,就会停止,除了调用了调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;
(4) unit:参数keepAliveTime的时间单位
(5) workQueue:一个阻塞队列,用来存储等待执行的任务
(6) threadFactory:线程工厂,主要用来创建线程
(7) handler:表示当拒绝处理任务时的策略
线程池的执行原理
1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。
2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
3、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。
有时间继续~
- 并发(2)--java线程池原理
- Java并发——线程池原理
- java并发编程(十七)----(线程池)java线程池架构和原理
- Java并发(4)深入分析java线程池框架及实现原理(一)
- Java并发(5)深入分析java线程池框架及实现原理(二)
- java并发编程—— 线程池原理 详解 ThreadPoolExecutor
- Java并发之线程池的实现原理
- Java 多线程线程池 - 线程池原理(2)
- java并发编程(6)--线程池
- JAVA 并发编程-线程池(七)
- java并发(二十)线程池
- java并发编程(一)-线程池
- JAVA 并发编程-线程池(七)
- Java并发编程(二)--线程池
- 并发编程--线程池ThreadPoolExecutor实现原理(二)
- Java线程总结(五):并发包------线程池Executors
- 【Java】并发之线程池
- 【Java】并发之线程池
- mybatis 多对一的理解
- C++中用rand()和srand()产生随机数介绍
- CentOS 7.3 x64 安装 Nginx
- Python中的二维数组(list与numpy.array)
- Laravel ORM写的语句怎么打印出原生Sql语句
- 并发(2)--java线程池原理
- Microsoft Office 2016 for Mac 破解安装
- 机器学习教程 之 线性模型:线性回归、对数几率回归、线性判别分析
- 如何快速熟悉一个老项目
- centos7上配置Samba服务器
- shell 脚本求差集
- Flask+uwsgi+Nginx+Ubuntu部署教程
- 堆模板(变量有瑕疵)
- Chang the PATH