Challenge: 线程池
Without Network
以下是一个不涉及网络的线程池练习:
假设你正在编写一个简单的任务调度程序,需要使用线程池来执行任务。任务是一个简单的计算任务(算矩阵相乘),要求计算给定数字的阶乘。
你的任务调度程序应该具备以下功能:
- 提供一个任务队列,用于接收需要计算的矩阵。
- 提供一个线程池,用于执行任务队列中的任务。
- 线程池应该具有固定数量的线程,例如10个线程。
- 当有新的任务到达时,任务调度程序应将任务添加到任务队列中,并由线程池中的线程执行。
- 每个线程在执行完一个任务后,应该继续从任务队列中获取下一个任务执行,直到任务队列为空。
- 程序应提供一个方法来关闭任务调度程序和线程池,以确保所有任务都被执行完毕。
任务要求
- 实现任务调度程序和线程池的基本框架。
- 编写代码来生成一些计算矩阵的任务,并将其添加到任务队列中。
- 观察线程池中的线程如何执行任务,并确保任务被正确执行。
- 添加任务完成的回调机制,以便在任务执行完成后进行一些操作,如打印结果或记录日志。
- 实现任务调度程序和线程池的关闭方法,确保所有任务都能被执行完毕并正确地关闭线程池。
With Network
实现一个简单的并发下载器
假设你正在开发一个下载器程序,需要同时下载多个文件。为了提高下载效率,你决定使用线程池来管理并发下载任务。具体需求如下:
- 创建一个线程池,用于执行下载任务。
- 线程池应该具有一定数量的工作线程,例如固定数量的线程或者根据系统资源动态调整的线程池。
- 下载任务应该包含文件的URL地址和本地保存路径。
- 线程池应该能够接受下载任务,并将任务分配给可用的工作线程进行执行。
- 每个工作线程负责下载一个文件,并将下载的文件保存到指定的本地路径。
- 下载任务可以是耗时的操作,线程池应该能够同时处理多个下载任务,提高下载效率。
- 下载完成后,线程池应该通知主线程或其他组件进行后续处理或等待新任务。
任务要求
- 线程池的初始化和管理:创建线程池并管理其中的工作线程。
- 任务队列:用于接收和存储待执行的下载任务,线程池从任务队列中获取任务进行处理。
- 线程池调度:线程池需要实现任务调度算法,将下载任务分配给可用的工作线程进行执行。
- 下载任务的执行:每个工作线程负责下载一个文件,并将下载的文件保存到指定的本地路径。
- 下载完成后的处理:线程池需要通知主线程或其他组件进行后续处理,例如文件合并或其他操作。
根据自己的理解手动实现一个简单的线程池。
可选任务
- 动态调整线程池中的线程数量,观察执行效率的变化。