设计一个线程池,在真正写代码之前,有很多设计需要考虑,大概如下:
1任务队列的设计,一个队列,多个线程互斥访问,或者每个线程一个队列,不需要互斥访问。
2 线程退出的设计,可以由主线程检测空闲线程,然后使子线程退出。或者子线程退出,通知主线程。空闲不一定是没有任务就退出,可以设计空闲时间达到阈值后退出,因为创建线程是有时间开销的。
3 任务数的设计,每个线程可以有个任务数,还可以增加一个总任务数,即全部线程任务数加起来
4 选择线程的设计,选择任务数最少的线程。
5 线程类型的设计,可以区分核心线程和预备线程,任务少的时候,核心线程处理就行。任务多也创建预备线程帮忙处理。
6 线程池类型的设计,cpu密集型的,线程数等于核数,否则自定义线程数就行。
7 支持任务的取消和超时机制,防止一个任务时间过长或者死循环。
本文介绍的线程池具体设计思想如下(参考java):
1 主线程维护一个队列,子线程的任务由子线程负责分发,不需要互斥访问,子线程也不需要维护自己的队列。
2 线程退出的设计,主线程负责检查子线程空闲时间是否达到阈值,是则使子线程退出。
3 任务数的设计,主线程负责管理任务个数并应有相应的策略。
4 选择线程的设计,选择任务数最少的线程。
5 线程类型的设计,区分核心线程和预备线程,任务少的时候,核心线程处理就行。任务多也创建预备线程帮忙处理。
6 线程池类型的设计,cpu密集型的,线程数等于核数,否则自定义线程数就行。
7 支持任务的取消和超时机制,超时或者取消的时候,主线程判断任务是待执行还是正在执行,如果是待执行则从任务队列中删除,如果是正在执行则杀死对应的子线程。下面我们看一下具体的设计。