并发(2)--java线程池原理
2017-08-31 22:59
435 查看
线程池Execotors工具可以创建普通的线程池以及schedule调度任务的调度池。使用线程池的一个优点就是:
1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。
2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。
线程池创建的方式是:
从源码上我们看出了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:表示当拒绝处理任务时的策略
2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
3、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。
有时间继续~
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、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。
有时间继续~
相关文章推荐
- java并发编程之源码分析ThreadPoolExecutor线程池实现原理
- Java 并发编程深入学习——线程池及其实现原理
- Java并发——线程池原理
- Java并发——线程池原理
- Java并发之线程池的实现原理
- <关于并发框架>Java原生线程池原理及Guava与之的补充
- Java并发编程之深入理解线程池原理及实现
- java并发包&线程池原理分析&锁的深度化
- Java并发编程札记-(六)JUC线程池-02ThreadPoolExecutor实现原理
- <关于并发框架>Java原生线程池原理
- java并发编程-线程池的使用
- Java Executor并发框架(十一)Executor框架线程池生命周期
- Java并发编程:Synchronized及其实现原理
- 【Java 并发系列】深入分析Volatile的实现原理
- Java 线程池的原理与实现
- Java并发编程:4种线程池和缓冲队列BlockingQueue
- 【转】Java并发编程:线程池的使用
- 【转】java线程池的原理和机制
- java 线程池底层原理
- Java 线程池的原理与实现