0
点赞
收藏
分享

微信扫一扫

java-线程池基本原理

minute_5 2022-03-11 阅读 49

目录

  1. 并发队列
  2. 线程池简介
  3. 为什么需要线程池
  4. 线程池原理
  5. 线程池的分类

一、并发队列

  1. 基本概念
    并发队列是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素。
  2. 分类
    并发队列分为阻塞队列和非阻塞队列,下面举例示意:
    现有一个长度为10的队列,有11个元素需要放进去
    在这里插入图片描述
  3. 阻塞队列和非阻塞队列区别

(1)入队时
非阻塞队列:当向队列中放入10个元素,此时队列已满,再放入第11个元素数据就会丢失。
阻塞队列:当队列已满了的时候,此时会进行等待,什么时候队列中有出队的元素,那么第11个再放进去。

(2)出队时
非阻塞队列:如果队列中没有元素了,此时进行出队操作,往外取元素,得到的就是null。
阻塞队列:当队列中没有元素时,如果此时进行出队操作会等待,什么时候放进去,什么时候再取出来。

特别地,线程池就是基于阻塞队列实现的。

二、线程池简介

	线程池是一种多线程处理形式,处理过程中将任务添加到队列,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务。执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。

简单来说,线程池就是线程的集合。

三、为什么需要线程池

线程的正常生命周期如下图所示:
在这里插入图片描述
了便于分析,假设各阶段所花时间如上所示(当然线程各阶段实际所花时间极短,为毫秒级)。如果我们能省略其他阶段,每次线程直接运行任务,这样就可以单个线程处理任务就可以节省5秒。要实现这样的设想,我们可以使用线程池来处理,因为线程池中的线程是事先创建好的大量空闲线程,当队列中的任务进入线程池中,线程可以直接执行任务,执行完成后释放资源,继续处理下一任务。
举例来看:现有100个任务需要处理,一次最多创建10个线程。如果采用普通方式,一次创建10个线程处理10个任务,总共需60秒,而采用线程池的方式,一次执行10个任务,总共需要10秒。
综上所述:我们可以很明显的看出线程池在处理任务量极大的高并发系统中,具有很大的优势

四、线程池基本原理

在这里插入图片描述

  1. ThreadPoolExecutor核心类
    线程池的最上层接口是Executor,这个接口定义了一个核心方法execute(Runnablecommand),这个方法是用来传入任务的,最后被ThreadPoolExecutor类实现。而且ThreadPoolExecutor是线程池的核心类,此类的构造方法如下:
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue);

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);
 
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnitunit,BlockingQueue<Runnable>workQueue,RejectedExecutionHandler handler);
 
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);

参数名 参数含义
corePoolSize 核心线程池大小,也即核心线程的数量
举报

相关推荐

0 条评论