go并发编程系列七:手写一个线程池

明月清辉 / 2023-09-07 / 原文

背景:提到线程池,我们会有大概的印象,通常我们对线程池的理解是:一组活跃的线程,但是这种理解是片面的,不完整的,为此,在手写线程池之前,我们一定要明确线程池到底是什么?不要以我以为的方式去写代码。

 

一、线程池有以下要素组成

线程队列(Task Queue):用于存储待执行的任务,通常是一个先进先出(FIFO)队列。

工作线程池(Worker Threads):由一组已创建的线程组成,它们等待从任务队列中获取任务并执行它们。

管理器(Manager):负责将任务分配给空闲的工作线程,并监控线程池的状态。

 把上述3个要素提取出来,以面向对象的思维,我们得到如下关键信息:

1、任务

2、任务队列

3、工作线程池

任务是需要线程池里的工作线程处理的,而线程池的工作线程是一组已创建的线程,任务是通过队列进入到线程池的工作线程池进行处理,队列的特征是什么?先进先出,也就是说线程池处理任务本质上是:工作线程池处理队列里的任务,其处理任务的特征需要符合队列的特征。