C#多线程(二)
一、线程池
每次创建一个线程,都会花费几百微秒级别的时间来创建一个私有的局部栈,每个线程默认使用1M的内存。这个可以在使用Thread类的构造函数时设置:
- new Thread(new ThreadStart(Go), 2);
- new Thread(new ParameterizedThreadStart(Go("hello")), 3);
提供的两种构造函数方式都提供了对应的设置线程局部栈的大小。线程池通过共享和回收线程的方式来分配这些内存,这样可以使多线程运行在一个非常细粒度级别上而不影响性能。这对于充分利用多核处理器,使用分而治之的方式进行密集型计算的程序中很有用。同时线程池维护一个所有同时运行的工作线程总数的上限,如果有过多的活动线程就会加重操作系统的负担,使诸如CPU缓存失效等问题,当达到这个上限后,就要进行排队。这个线程队列使得任意并发的应用成为可能,如Web服务器就是这种原理。
有多种方式进入线程池:
- 通过Task Parallel Library(.NET 4 TPL)
- 通过调用ThreadPool.QueueUserWorkItem
- 通过异步委托方式
- 使用BackgroundWorker
- WCF、Remoting、ASP.NET、ASMX webservice
- System.Timers.Timer和System.Threading.Timer
- .NET中以Async结束命名的方法
- PLINQ
- 不能对放入线程池中的线程命名,这会使得调试更加困难
- 线程池中的线程总是后台线程
- 阻塞线程池中的线程困难引发额外的延迟
- CurrentTread.IsThreadPoolThread
二、进入线程池
- static void Main(string[] args)
- {
- Task.Factory.StartNew(Go);
- Console.WriteLine("Is Thread Pool: " + Thread.CurrentThread.IsThreadPoolThread.ToString());
- Console.ReadKey();
- }
- static void Go()
- {
- Console.Write("Is Thread Pool: " + Thread.CurrentThread.IsThreadPoolThread.ToString());
- }
Task.Factory.StartNew返回一个Task对象可以用来监控这个任务。
- static void Main(string[] args)
- {
- Task<string> task = Task.Factory.StartNew<string>(Go);
- Console.WriteLine("Is Thread Pool: " + Thread.CurrentThread.IsThreadPoolThread.ToString());
- if (task.IsCompleted)
- {
- string result = task.Result;
- Console.WriteLine(task.IsCompleted.ToString() + result);
- }
- Console.ReadKey();
- }
- static string Go()
- {
- return Thread.CurrentThread.IsThreadPoolThread.ToString();
- }
如果在工作线程中出现异常,当获取Task的Result属性时会重新引发AggregateException异常,如果没有查询Result或者没有调用Wait方法,所有未处理的异常都会终止进程执行。
- static void Main()
- {
- ThreadPool.QueueUserWorkItem (Go);
- ThreadPool.QueueUserWorkItem (Go, 123);
- Console.ReadLine();
- }
- static void Go (object data) // data will be null with the first call.
- {
- Console.WriteLine ("Hello from the thread pool! " + data);
- }
- static void Main()
- {
- Func<string, int> method = Work;
- method.BeginInvoke ("test", Done, method);
- // ...
- //
- }
- static int Work (string s) { return s.Length; }
- static void Done (IAsyncResult cookie)
- {
- var target = (Func<string, int>) cookie.AsyncState;
- int result = target.EndInvoke (cookie);
- Console.WriteLine ("String length is: " + result);
- }
三、线程池的优化
- 32位的.NET4.0环境为1023个
- 64位的.NET4.0环境为32768个
- .NET 3.5为每个CPU核 250个
- .NET2.0 为每个CPU核25个
- ThreadPool.SetMinThreads(50,50);
C#多线程(二)的更多相关文章
- java 多线程二
java 多线程一 java 多线程二 java 多线程三 java 多线程四 线程中断: /** * Created by root on 17-9-30. */ public class Test ...
- java基础-多线程二
java基础-多线程二 继承thread和实现Runnable的多线程每次都需要经历创建和销毁的过程,频繁的创建和销毁大大影响效率,线程池的诞生就可以很好的解决这一个问题,线程池可以充分的利用线程进行 ...
- C#夯实基础之多线程二:主线程、前台线程与后台线程
我们在<C#夯实基础之多线程一:初识多线程>一文中第二部分中指出,既然windows最终发展出了多线程模型,按理说,我们直接使用一个.NetFramework的线程类就可以直接撸代码了,但 ...
- Java:多线程<二> 同步
由于多线程的访问出现延迟和线程的随机性,在使用多线程时往往会伴随安全性的问题,这些问题一旦出现将会是非常严重的.为了解决这种安全性问题,synchronized出现了. synchronized用法一 ...
- Java多线程——<二>将任务交给线程,线程声明及启动
一.任务和线程 <thinking in java>中专门有一小节中对线程和任务两个概念进行了具体的区分,这也恰好说明任务和线程是有区别的. 正如前文所提到的,任务只是一段代码,一段要达成 ...
- 从零开始学习Java多线程(二)
前面已经简单介绍进程和线程,为后续学习做铺垫.本文讨论多线程传参,Java多线程异常处理机制. 1. 多线程的参数传递 在传统开发过程中,我们习惯在调用函数时,将所需的参数传入其中,通过函数内部逻辑处 ...
- 多线程二:线程池(ThreadPool)
在上一篇中我们讲解了多线程的一些基本概念,并举了一些例子,在本章中我们将会讲解线程池:ThreadPool. 在开始讲解ThreadPool之前,我们先用下面的例子来回顾一下以前讲过的Thread. ...
- Java多线程(二) —— 深入剖析ThreadLocal
对Java多线程中的ThreadLocal类还不是很了解,所以在此总结一下. 主要参考了http://www.cnblogs.com/dolphin0520/p/3920407.html 中的文章. ...
- python多线程(二)
原文:http://blog.sina.com.cn/s/blog_4b5039210100esc1.html 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机 ...
- 并发和多线程(二)--线程安全、synchronized、CAS简介
线程安全性: 当多个线程访问一个类的时候,这个类始终表示出正确的行为,那么这个类是线程安全的. 无状态的对象一定是线程安全的,例如大部分service.dao.Servlet都是无状态的. 线程安全体 ...
随机推荐
- 5.6 在线DDL (online DDL)详解
ONLINE ddl 原理: online ddl相关参数 测试原表数据是否能进行ONLINE DDL方法: online DDL 局限性 测试
- 返回类型和return语句
return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方.return语句有两种形式: return; return expression; 无返回值函数 没有返回值的return语句只 ...
- Setting up a database adapter
Setting up a database adapter zend-db provides a general purpose database abstraction layer. At its ...
- c/c++中动态内存分配处理字符串的细节问题
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h&g ...
- RadioGroup&RadioButton
RadioGroup提供多选一机制:属性orientation:“vertlcal” or “horizontal” @Override public void onCheckedChanged(Ra ...
- MySql安装步骤详解,MySql的root密码设置,启动MySql服务。
1.下载mysql安装包,并解压,双击mysql-5.6.24-winx64.msi 2.点击下一步 3.选择custom 4.选择安装内容和位置,5个安装内容要选择will be installed ...
- setTimeout和setImmediate以及process.nextTick的区别
在javascript中我们了解到了setTimeout和setInterVal函数事件队列(任务队列)的相关知识,除了setTimeout和setInterval这两个方法外,Node.js还提供了 ...
- ADC及DA的头文件复析
/************************************************************* ADC12,,,,这么多的定义,搞得我都昏死啦,抽出来可能好几一些..** ...
- 【并查集】PKU-1182 食物链
食物链 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不 ...
- JAXB - Validate Document before It is Unmarshalled
Validation A considerable part of the XML Schema language deals with facets, enabling the programmer ...