跳转至

Challenge: 线程池

Without Network

以下是一个不涉及网络的线程池练习:

假设你正在编写一个简单的任务调度程序,需要使用线程池来执行任务。任务是一个简单的计算任务(算矩阵相乘),要求计算给定数字的阶乘。

你的任务调度程序应该具备以下功能:

  1. 提供一个任务队列,用于接收需要计算的矩阵。
  2. 提供一个线程池,用于执行任务队列中的任务。
  3. 线程池应该具有固定数量的线程,例如10个线程。
  4. 当有新的任务到达时,任务调度程序应将任务添加到任务队列中,并由线程池中的线程执行。
  5. 每个线程在执行完一个任务后,应该继续从任务队列中获取下一个任务执行,直到任务队列为空。
  6. 程序应提供一个方法来关闭任务调度程序和线程池,以确保所有任务都被执行完毕。

任务要求

  • 实现任务调度程序和线程池的基本框架。
  • 编写代码来生成一些计算矩阵的任务,并将其添加到任务队列中。
  • 观察线程池中的线程如何执行任务,并确保任务被正确执行。
  • 添加任务完成的回调机制,以便在任务执行完成后进行一些操作,如打印结果或记录日志。
  • 实现任务调度程序和线程池的关闭方法,确保所有任务都能被执行完毕并正确地关闭线程池。

With Network

实现一个简单的并发下载器

假设你正在开发一个下载器程序,需要同时下载多个文件。为了提高下载效率,你决定使用线程池来管理并发下载任务。具体需求如下:

  1. 创建一个线程池,用于执行下载任务。
  2. 线程池应该具有一定数量的工作线程,例如固定数量的线程或者根据系统资源动态调整的线程池。
  3. 下载任务应该包含文件的URL地址和本地保存路径。
  4. 线程池应该能够接受下载任务,并将任务分配给可用的工作线程进行执行。
  5. 每个工作线程负责下载一个文件,并将下载的文件保存到指定的本地路径。
  6. 下载任务可以是耗时的操作,线程池应该能够同时处理多个下载任务,提高下载效率。
  7. 下载完成后,线程池应该通知主线程或其他组件进行后续处理或等待新任务。

任务要求

  • 线程池的初始化和管理:创建线程池并管理其中的工作线程。
  • 任务队列:用于接收和存储待执行的下载任务,线程池从任务队列中获取任务进行处理。
  • 线程池调度:线程池需要实现任务调度算法,将下载任务分配给可用的工作线程进行执行。
  • 下载任务的执行:每个工作线程负责下载一个文件,并将下载的文件保存到指定的本地路径。
  • 下载完成后的处理:线程池需要通知主线程或其他组件进行后续处理,例如文件合并或其他操作。

根据自己的理解手动实现一个简单的线程池。

可选任务

  • 动态调整线程池中的线程数量,观察执行效率的变化。