并发--java线程池原理

Posted 李晓娜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发--java线程池原理相关的知识,希望对你有一定的参考价值。

    线程池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、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。 

    有时间继续~


以上是关于并发--java线程池原理的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程:Java线程池核心ThreadPoolExecutor的使用和原理分析

Java并发编程原理与实战三十七:线程池的原理与使用

Java线程池的使用及工作原理

Java并发编程(十三)-- 线程池实现原理

Java并发编程原理与实战三十八:多线程调度器(ScheduledThreadPoolExecutor)

Java并发多线程编程——线程池的原理与使用