线程池

作者: Cajesse佳泽 | 来源:发表于2017-04-24 23:58 被阅读0次

此文参考博客编写.

1.什么是线程池

线程池就是若干个线程的集合,这些线程被池化了,能够执行多个任务.而并非只为执行一次任务而创建,也并非执行完任务就销毁.

2.线程池的实现原理

上述提到的若干个线程,我们称之为工作线程. 一个线程池中通常有个定量的阻塞队列queue与其配合使用,当外部向一个线程池提交一个任务时,线程池会将这个任务放置到queue中,而线程池中的工作线程会不断向queue中取出任务执行.执行完之后如果发现queue不为空,则继续取,如果queue已经为空, 工作线程们进入waiting状态. 待queue再次不会空,这些线程会被唤醒.从而进行下一次任务的执行.大概原理就是这样

3.线程池如何使用

看看JDK为我们提供的ThreadPoolExecutor.
我们可通过ThreadPoolExecutor来创建一个线程池.再调用其execute方法,传入我们的任务Runable对象即可.

  1. 参数
  • int corePoolSize
    基本工作线程数量
  • int maximumPoolSize
    最大工作线程数量
  • long keepAliveTime
    默认全部工作线程除去基本工作线程的线程空闲时间.也可设置为所有线程的空闲时间. 一旦空闲时间超过了设定值,工作线程将被销毁.
  • TimeUnit unit
    描述上个参数的单位.
  • BlockingQueue<Runnable> workQueue
    存放任务的阻塞队列
  • ThreadFactory threadFactory
    作用是根据任务Runable对象来生产工作线程中的线程. 比如可以对生成的线程设置名字等属性.
  • RejectedExecutionHandler handler
    如果任务Runable对象被拒绝了,将会调用
    handler.rejectedExecution(Runnable r, ThreadPoolExecutor executor)
    你可以抛出异常或者选择死亡
  1. 工作流程


    流程图

    看完上述对参数比较口语化的描述.我们用他们来模拟一个ThreadPoolExecutor当执行execute方法是怎么干的
    首先我们需要用一个Set<Worker>表示当前我们持有的工作线程.

  • 如果set的size比corePoolSize小,那就证明还没有达到基本数量. 这个时候新建一个工作线程Worker来执行Runable对象并将Worker放入set.
  • 如果set的size已经比corePoolSize大.那这个时候把Runable对象放入构造函数传进来的BlockingQueue. 注意.此时调用的不是put方法,也不是add方法,是offer方法. offer方法特点就是如果队列已满就返回false.不等待也不抛异常,很老实.. 如果放入成功,后续就会有工作线程来取走这个Runable对象.
放入Queue
  • 如果放入失败了. 那么判断set的size是不是比maximumPoolSize 小. 如果小,新建一个工作线程Worker来执行Runable对象.并将Worker放入set.
  • 如果大,这个时候拒绝执行Runable对象. 调用构造函数传入的RejectedExecutionHandler.rejectedExecution();
  1. ThreadPoolExecutor状态
状态流转图
  • RUNNING
    初始状态,接受新任务并且处理已经在队列中的任务。
  • SHUTDOWN
    不接受新任务,但处理队列中的任务。
  • STOP
    不接受新任务,不处理排队的任务,并中断正在进行的任务。
  • TIDYING
    所有任务已终止,workerCount为零,线程转换到状态TIDYING,这时回调terminate()方法。
  • TERMINATED
    终态,terminated()执行完成。

4.线程池的意义

  • 降低资源消耗
    通过重复利用已创建的线程降低线程创建和销毁的消耗
  • 提高响应速度
    当一个任务到达的时候,不必等待线程创建的时间就可以马上执行.
  • 提高线程的可管理性
    线程是稀缺的资源,如果无限制地创建,会降低系统的稳定性.使用线程可以进行统一分配/调优/监控.

相关文章

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • Spring Boot之ThreadPoolTaskExecut

    初始化线程池 corePoolSize 线程池维护线程的最少数量keepAliveSeconds 线程池维护线程...

  • 线程池

    1.线程池简介 1.1 线程池的概念 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性...

  • 多线程juc线程池

    java_basic juc线程池 创建线程池 handler是线程池拒绝策略 排队策略 线程池状态 RUNNIN...

  • ThreadPoolExecutor线程池原理以及源码分析

    线程池流程: 线程池核心类:ThreadPoolExecutor:普通的线程池ScheduledThreadPoo...

  • 线程池

    线程池 [TOC] 线程池概述 什么是线程池 为什么使用线程池 线程池的优势第一:降低资源消耗。通过重复利用已创建...

  • java 线程池使用和详解

    线程池的使用 构造方法 corePoolSize:线程池维护线程的最少数量 maximumPoolSize:线程池...

  • 线程池

    JDK线程池 为什么要用线程池 线程池为什么这么设计 线程池原理 核心线程是否能被回收 如何回收空闲线程 Tomc...

网友评论

      本文标题:线程池

      本文链接:https://www.haomeiwen.com/subject/evapzttx.html