写一个线程池

本文详细介绍了.NET框架中线程池ThreadPool的QueueUserWorkItem方法使用方法及两个重载版本的区别。通过实例代码展示了如何使用委托WaitCallback传递方法及数据对象到线程池任务。

 1.参照MSDN,有委托为类库定义public delegate void WaitCallback ( Object state)
2.ThreadPool.QueueUserWorkItem 方法重载列表
ThreadPool.QueueUserWorkItem (WaitCallback)  将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。
由 .NET Compact Framework 支持。

ThreadPool.QueueUserWorkItem (WaitCallback, Object)  将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
由 .NET Compact Framework 支持。

以下是一个使用 Python 的 `concurrent.futures` 模块实现的线程池(`ThreadPoolExecutor`)的完整实例。这个例子模拟了多个任务并发执行,比如下载文件、处理数据等耗时操作。 ```python import time from concurrent.futures import ThreadPoolExecutor, as_completed # 模拟一个耗时的任务 def task(n): print(f"开始执行任务 {n}") time.sleep(2) # 模拟 I/O 操作,如网络请求或文件读 result = n * n print(f"任务 {n} 执行完成,结果为 {result}") return result def main(): # 创建一个最多包含 3 个线程的线程池 with ThreadPoolExecutor(max_workers=3) as executor: # 提交任务到线程池(非阻塞) futures = [executor.submit(task, i) for i in range(1, 6)] # 获取任务返回结果(按完成顺序) for future in as_completed(futures): result = future.result() print(f"获取到结果: {result}") if __name__ == "__main__": start_time = time.time() main() end_time = time.time() print(f"总耗时: {end_time - start_time:.2f} 秒") ``` ### 解释: - `ThreadPoolExecutor(max_workers=3)`:创建一个最多有 3 个线程的线程池,可以同时运行 3 个任务。 - `executor.submit(task, i)`:向线程池提交一个任务,返回一个 `Future` 对象,表示尚未完成的计算。 - `as_completed(futures)`:它会按任务完成的**先后顺序**返回对应的 `Future`,这样我们能尽早处理已完成的任务结果。 - `future.result()`:获取该任务的返回值,如果任务还没完成,此方法会阻塞直到结果可用。 - `with` 语句确保线程池在使用完毕后被正确关闭,避免资源泄漏。 #### 示例输出: ``` 开始执行任务 1 开始执行任务 2 开始执行任务 3 任务 1 执行完成,结果为 1 获取到结果: 1 开始执行任务 4 任务 2 执行完成,结果为 4 获取到结果: 4 开始执行任务 5 任务 3 执行完成,结果为 9 获取到结果: 9 任务 4 执行完成,结果为 16 获取到结果: 16 任务 5 执行完成,结果为 25 获取到结果: 25 总耗时: 4.02 秒 ``` > 注意:虽然有 5 个任务,但因为每次只有 3 个线程在运行,所以前 3 个先启动,等其中一个完成后才会启动第 4 和第 5 个。总共耗时约 4 秒(2秒 + 2秒),而不是串行的 10 秒。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值