2019年互联网(1.8)

一.JUC多线程及并发包

1.8.线程池用过吗?ThreadPoolExecutor谈谈你的理解?

为什么使用线程池?

线程池作的工作主要:

  1. 控制运行线程的数量

  2. 处理过程中将任务加入队列,在线程创建后,直接启动这些任务

  3. 如果创建超过了最大数量,超出的数量将进入队列排队登录,等其他线程执行完毕以后,再从队列中取出任务来执行

    主要特点:

    1. 线程复用
    2. 控制最大并发数
    3. 管理线程

    优势:

    第一:减低资源消耗,通过重复利用自己创建的线程降低线程创建和销毁造成的CPU资源消耗

    第二: 提高响应速度,当任务到达时,任务可以不需要等到线程更改状态,就可以直接启动

    第三:提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗CPU资源,还会降低系统

    的稳定性,

    使用线程池,可以统一分配,调优,和监控

线程池如何使用

架构实现

Java中的线程池 主要通过Executor框架实现的,该框架用到了Executor,Executors,ExecutorService,ThreadPoolExecutor这几个类

编码实现

Executors.newWorkStealingPool(int);

java8新增,使用目前机器上可以的处理器作为他的并行级别

重点三个线程池类:

Executors.newFixedThreadPool(int): 执行一个长期的任务,性能好很多

主要特点如下:

1.创建一个定长线程池,可控制线程的最大并发数,超出的线程会在队列中等待.

2.newFixedThreadPool创建的线程池corePoolSize和MaxmumPoolSize是 相等的,它使用的的LinkedBlockingQueue

线程池核心大参数

corePoolSize: int

maximumPoolSize:int

workQueue: LinkBlockingQueue

Executors.newSingleThreadExecutor():一个任务一个线程执行的任务场景

主要特点如下:

1.创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务都按照指定顺序执行.

2.newSingleThreadExecutor将corePoolSize和MaxmumPoolSize都设置为1,它使用的的LinkedBlockingQueue

corePoolSize: 1

maximumPoolSize:0

workQueue: LinkBlockingQueue

Executors.newCachedThreadPool():适用:执行很多短期异步的小程序或者负载较轻的服务器

主要特点如下:

1.创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则创建新线程.

2.newCachedThreadPool将corePoolSize设置为0MaxmumPoolSize设置为Integer.MAX_VALUE,它使用的是SynchronousQUeue,也就是说来了任务就创建线程运行,如果线程空闲超过60秒,就销毁线程

corePoolSize: 0

maximumPoolSize:MAX_Integer

workQueue: SynchronousQueue

线程池的7大参数

1.corePoolSize:线程池中的常驻核心线程数
2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1
3.keepAliveTime:多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁直到只剩下corePoolSize个线程为止
4.unit:keepAliveTime的单位
5.workQueue:任务队列,被提交但尚未被执行的任务.
6.threadFactory:表示生成线程池中工作线程的线程工厂,用户创建新线程,一般用默认即可
7.handler:拒绝策略,表示当线程队列满了并且工作线程大于等于线程池的最大显示 数(maxnumPoolSize)时如何来拒绝.

线程池的底层原理

所有线程底层所创建的线程池都是基于以下线程池来创建的!

底层源码:

image-20210222193557214

四种常见的线程池:

CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。

SecudleThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。

SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。

FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程

线程执行流程如下:(口述)

image-20210222193704099

posted @ 2021-02-27 17:47  Hugo_nice  阅读(62)  评论(0)    收藏  举报