并发:线程池异步执行与创建单独的线程执行
2018-01-29 16:54
405 查看
线程池与并行度
了解线程池如何工作于大量的异步操作,以及它与创建大量单独的线程的方式的不同之处。实例代码验证
static void Main(string[] args) { const int numberOfOperations = 500; var sw = new Stopwatch(); sw.Start(); UseThreads(numberOfOperations); sw.Stop(); Console.WriteLine("Thread Execution time using threads: {0}", sw.ElapsedMilliseconds); sw.Reset(); sw.Start(); UseThreadPool(numberOfOperations); sw.Stop(); Console.WriteLine("ThreadPool Execution time using threads: {0}", sw.ElapsedMilliseconds); Console.ReadKey(); } static void UseThreads(int numberOfOperations) { using (var countdown = new CountdownEvent(numberOfOperations))//并发执行个数 { Console.WriteLine("Scheduling work by creating threads"); for (int i = 0; i < numberOfOperations; i++) { var thread = new Thread(() => { Console.Write("{0},", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(TimeSpan.FromSeconds(0.1)); countdown.Signal();//注册当前线程 }); //thread.IsBackground = true; thread.Start(); } countdown.Wait(); Console.WriteLine(); } } static void UseThreadPool(int numberOfOperations) { using (var countdown = new CountdownEvent(numberOfOperations))//并发执行个数 { Console.WriteLine("Starting work on a threadpool"); for (int i = 0; i < numberOfOperations; i++) { ThreadPool.QueueUserWorkItem( _ => { Console.Write("{0},", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(TimeSpan.FromSeconds(0.1)); countdown.Signal();//注册当前线程 }); } countdown.Wait(); Console.WriteLine(); } }
Thread Execution time using threads: 5211
ThreadPool Execution time using threads: 5948
结论
线程池为操作系统节省了内存和线程数,但是也为此付出了更长的执行时间。相关文章推荐
- 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析
- C# 执行固定个数任务自行控制进入线程池的线程数量,多任务同时但是并发数据限定
- 使用NSThread创建线程,执行NSTask,但是异步读取pipe的时候出错
- C# 执行固定个数任务自行控制进入线程池的线程数量,多任务同时但是并发数据限定
- Service学习——第五篇 使用IntentService在单独线程上执行异步任务
- GCD的定义及使用详解(同步异步、并发串行、线程间通信、延时执行、只执行一次代码)
- TCP并发服务器(六)——创建线程池,每个线程accept,accept使用互斥锁保护——基于UNP代码
- 线程、线程池、并发、同步、异步、锁
- 使用 线程池,控制线程 , 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待:
- python基础-线程创建、线程池、进\线程异步回调(add_done_callback)、进\线程数据共享、ftp线程池
- 多线程线程池控制一个方法的并发量 限制只有5个线程执行任务
- 安卓(Android)中如何优雅的 创建/执行 异步任务/回调(AsyncTask 、Thread、Job、CallBack、Handler) ?线程池(Executor)
- 线程池(thread pool),允许有多个线程同时存在,并发执行,并且这些线程受到统一管理。
- 什么时候手动创建线程而不使用线程池
- Java并发编程:如何创建线程?
- 在Application的onCreate中创建线程,线程不能被执行
- spring线程池,全部执行完子线程在执行主线程
- 多线程并发: 带任务描述和执行时间的线程池执行简易框架
- 线程实用解析---------(二)创建调用有参函数的线程和线程池简介
- C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现