美文网首页
线程池笔记

线程池笔记

作者: 雨中独奏 | 来源:发表于2019-03-06 23:45 被阅读0次

ThreadPoolExecutor

线程池的实现类是ThreadPoolExecutor类,完整的构造方法有7个参数,通过传入不同的参数值可以实现不同功能的线程池。如单个线程的线程池,固定大小的线程池,可缓存无界的线程池,定时线程池等。参数如下:
1.corePoolSize 核心线程池大小,线程池执行任务时,优先会创建线程直到数量为这个值。
2.workQueue 阻塞队列,核心线程池满了后,将会创建线程放入阻塞队列进行等待。对于无界的线程池此阻塞队列是SynchronousQueue类型。
3.keepAliveTime 超时终止时间。超过核心线程池大小时,线程等待执行任务的时间,若超时则终止线程。使线程数量为corePoolSize。
4.unit keepAliveTime 的时间单位
5.maximumPoolSize 线程池最大数量。核心线程池和阻塞队列都满了后,会直接创建一个线程执行任务。如果此时线程总数超过了最大数量则调用handler。
6.threadFactory 创建线程的工厂,所有的任务都通过工厂来创建线程去执行。
7.handler 超出线程池最大数量后执行的处理程序,通常使用拒绝策略。

所有执行任务的线程都放在HashSet<Worker> workers中。还有一个原子类AtomicInteger ctl,ctl记录了"线程池中的任务数量"和"线程池状态"2个信息。ctl共包括32位。其中,高3位表示"线程池状态",低29位表示"线程池中的任务数量"。

Worker

每一个worker包含了一个线程thread(由threadFactory创建,就是woker本身)和要执行的任务firstTask
线程池执行任务的入口是exectue()方法,通过ctl判断当前线程池状态后,来新增worker去执行任务还是添加到阻塞队列。首先设置firstTask为要执行的任务Runnable,然后把当前worker创建为一个线程thread。启动线程
从而执行worker中的run方法,从而执行runworker方法,最终会调用firstTask的run()。
Worker继承了AQS,在执行任务时lock()加上独占锁保证线程安全。

相关文章

  • 带你从源码分析AsyncTask

    前言 AsyncTask的分析会用到线程池的相关知识,如果没有了解过,可以先看一下我的笔记:线程池笔记 基础 As...

  • Java并发之JDK并发包(2)

    实战Java高并发程序设计笔记 线程复用:线程池 线程池可以有效的控制系统中线程的数据,可以避免线程不断的创建和关...

  • 线程池常见方法解读

    对于记性不好的同学写笔记很重要,有问题欢迎大家留言交流,sam出品。 线程池 用线程池解决的问题: 创建/销毁线程...

  • 线程笔记四(线程池、Lambda表达式)

    线程笔记四(线程池、Lambda表达式) 线程思想: ​ 我们使用线程的时候就去创建一个线程,这样实现起来非...

  • 线程池笔记

    1. 线程池 基本功能:线程的复用,减少创建和销毁线程的开销 当系统接收到一个任务时,需要一个线程,并不会立刻去创...

  • 线程池笔记

    线程池的好处是: 减避免因为线程频繁创建与销毁带来的开销 能有效控制线程池的最大并发数,避免大量的进程因为互相抢占...

  • 线程池笔记

    ThreadPoolExecutor 线程池的实现类是ThreadPoolExecutor类,完整的构造方法有7个...

  • 线程池笔记

    前言:线程池相关的所有类都在java.util.concurrent包下面 一、线程池的继承关系: 二、重点介绍T...

  • java线程池

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

  • 线程池

    最近项目组组织学习线程池,也受到了打击,以后坚持做笔记不偷懒了。 要了解线程池先了解几个相关的概念 线程:进程中负...

网友评论

      本文标题:线程池笔记

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