设计一个支持异步任务的线程池
线程池是存放多个线程的容器,当CPU调用时,直接从线程池中取出线程,执行完成后,重新放回到线程池中。
避免频繁的创建和销毁;架构解耦,线程创建与任务处理解耦,更加优雅;线程池是使用线程的最佳实践。
1、实现线程安全的队列Queue
需要实现:获取当前队列中元素的数量、插入队列元素的方法、从队列中取出元素的方法。
需要考虑:
多线程同时访问队列中的元素。保证多个线程获取的串行,使用锁。
队列元素为空的时候获取队列中元素。阻塞,等待队列不为空,使用条件变量。
2、实现基本任务对象Task
定义任务的基本参数,任务的唯一标记,存放任务的基本逻辑。可以通过函数引用传输任务逻辑(Python)。
3、实现任务处理线程ProcessThread
任务处理线程需要不断的从任务队列中取任务执行。任务处理线程需要一个标记,标记线程需要什么时候应该停止。
实现ProcessThread:
基本属性(任务队列、标记)
线程的处理逻辑(run),执行Task中的任务
线程的停止(stop)
4、实现任务处理线程Pool
存放多个任务处理线程;负责多个线程的启停;管理向线程池的提交任务,下发给线程去执行。
实现Pool:
基本属性
提交任务(put,batch_put)
线程的启和停(start,join)
线程池大小(size)
线程池大小约定俗称的一般为CPU核数的两倍。(最佳实践)
5、实现异步任务处理AsyncTask
不知道任务什么时候执行,不知道任务什么时候执行完成。
给任务添加一个标记,任务完成后,则标记任务完成;任务完成时可直接获取任务运行结果;任务未完成时,获取任务结果,会阻塞获取任务线程。
设置运行结果、获取运行结果