C# thread类
2016-02-20 19:25
543 查看
http://wenku.baidu.com/link?url=xvb6ssaFDMZ0e8RQ_CpABmvxFPY7xP8qsZiB7rHK3ysgtm2ePv972QW_XScypa50kAn7edh-wAhV1RqYcumWl8Um9KH7APXZyzSa6Hxd2hu
Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数。下面我们用一个例子来解释怎样用Thread类来创建一个简单的线程
staticvoid Main(string[] args) { #region Thread无参数举例 Thread th = newThread(ThreadChild); th.Start(); Console.WriteLine("Main Thread Start!"); #endregion } staticvoid ThreadChild() { Console.WriteLine("Child Thread Start!"); }
输出结果
程序运行的结果不能保证哪个先输出,因为线程是由操作系统调度,每次哪个线程在前面可以不同 给线程传递数据
上面的例子演示了怎样用Thread类来创建一个不带传参的线程,下面我门来创建一个带传入参数的线程。给线程传递参数,有两种方式,一种是使用带ParameterizedThreadStart委托参数的Thread的构造函数,http://qun.81nanchang.cn 另外一种是定义一个自定义类。首先我们使用ParameterizedThreadStart委托来创建有传入参数的类。使用ParameterizedThreadStart,线程的入口(线程调用的方法)必须有一个Object类型的参数,使用Object我们首先想到的就是类型不安全。而且在执行线程的时候多半有装箱拆箱操作。管它的,我们先用这种方式来创建一个带传入参数的线程!! 废话再多,还是没有直接上代码来得实在,看代码!!
staticvoid Main(string[] args) { #region使用parameterizedThreadStart委托执行带参数的委托 Thread th2 = newThread(Thread_param); th2.Start(20); #endregion } staticvoid Thread_param(object msg) { int message = (int)msg; Console.WriteLine("Result:{0}",message); }
运行结果
上面创建的线程是类型不安全的,那用什么样的方式执行带传入参数的线程的方法是类型安全的呢,http://www.caise8.com 答案就是创建一个自定义类,在类中定义一个作为传入参数的字段,将线程的主方法定义为一个类的实例方法。然而使用这种方法就可以使用泛型来解决使用ParameterizedThreadStart的类型不安全看招!!!!
class Program { staticvoid Main(string[] args) { #region使用自定义类实现带参数的线程 MyThread<string> mythread = new MyThread<string>("Thread_child"); Thread th3 = newThread(mythread.ThreadChild); th3.Start(); #endregion } } class MyThread<T> { private T data; public MyThread(T data) { this.data = data; } publicvoid ThreadChild() { Console.WriteLine("Child Thread Start! Result:{0}",data); }}
运行结果:
后台线程Thread类默认创建的是前台线程,所以我们前面创建的线程全部都是前台线程。只要有一个前台线程在运行,应用程序的进程就在运行。如果有多个前台线程在运行,而Main()方法(主线程)结束了,应用程序的进程就仍然是激活的,直到所有前台线程完成其任务为止。 那后台线程呢?显然和前台线程相反。当主线程结束后,应用程序的进程就终止了,在所有前台线程结束后,后台线程就会被终止。 在编码的时候我们可以设置Thread类的IsBackground的属性来确定该线程是前台线程还是后台线程。当IsBackground设置为False的时候,为前台线程,设置为Ture的时候为后台线程,下面我们举例来说明前台线程和后台线程的区别。首先我们创建一个前台线程。
staticvoid Main(string[] args) { Thread th_pre = new Thread(Thread_pre) {Name="Thread_pre",IsBackground=flase};; th_pre.Start(); Console.WriteLine("主线程执行完成!"); } staticvoid Thread_pre() { Console.WriteLine("子线程开始执行!"); Thread.Sleep(3000); Console.WriteLine("子线程执行完成!"); }
运行结果
从上面的运行结果可以看到,当主线程执行完成后,应用程序终止前就会子线程执行完成。 下面我们来看看后台线程,看代码!!
staticvoid Main(string[] args) {Thread th_back = newThread(Thread_back){ Name="Thread_back",IsBackground=true }; th_back.Start(); Console.WriteLine("主线程执行完成!"); } staticvoid Thread_back() { Console.WriteLine("子线程开始执行!"); Thread.Sleep(3000); Console.WriteLine("子线程执行完成!"); }
运行结果
从运行结果可以看出,当主线程结束后,进程就终止了,后台线程也被终止,所以没有后台线程结束的输出信息。控制线程 我们使用Thread创建线程后,我们需要对线程进行控制。1、 使用Start()方法使线程处于Running状态,线程开始执行。2、 使用Join()方法使线程处于WaitSleepJoin状态,在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止或经过了指定时 间为止。3、 使用Sleep()方法,也会使线程处于WaitSleepJoin状态,在经历Sleep()方法定义的时间段后,线程就会被再次唤醒。、4、 使用Abort()方法,会使线程处于ResetAbort()状态,线程在接到这个命令的时候,会抛出一个ThradAbordException类型的异常。各位看官,看代码
using System;using System.Text;using System.Threading;namespace ConsoleThreadContral{ class Program { staticvoid Main(string[] args) { Console.WriteLine("mainThread Start!"); Thread th = newThread(newThread); th.Start();//将当前实例的状态更改为 ThreadState.Running。 Console.WriteLine("newThread State:{0}",th.ThreadState); th.Join(100);//在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止或经过了指定时间为止。 Console.WriteLine("newThread State:{0}", th.ThreadState); th.Abort();//在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。 Console.WriteLine("newThread State:{0}", th.ThreadState); } staticvoid newThread() { Console.WriteLine("newThread Start!"); Thread.Sleep(10000); Console.WriteLine("newThread Complete!"); } }}
运行结果
Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数。下面我们用一个例子来解释怎样用Thread类来创建一个简单的线程
staticvoid Main(string[] args) { #region Thread无参数举例 Thread th = newThread(ThreadChild); th.Start(); Console.WriteLine("Main Thread Start!"); #endregion } staticvoid ThreadChild() { Console.WriteLine("Child Thread Start!"); }
输出结果
程序运行的结果不能保证哪个先输出,因为线程是由操作系统调度,每次哪个线程在前面可以不同 给线程传递数据
上面的例子演示了怎样用Thread类来创建一个不带传参的线程,下面我门来创建一个带传入参数的线程。给线程传递参数,有两种方式,一种是使用带ParameterizedThreadStart委托参数的Thread的构造函数,http://qun.81nanchang.cn 另外一种是定义一个自定义类。首先我们使用ParameterizedThreadStart委托来创建有传入参数的类。使用ParameterizedThreadStart,线程的入口(线程调用的方法)必须有一个Object类型的参数,使用Object我们首先想到的就是类型不安全。而且在执行线程的时候多半有装箱拆箱操作。管它的,我们先用这种方式来创建一个带传入参数的线程!! 废话再多,还是没有直接上代码来得实在,看代码!!
staticvoid Main(string[] args) { #region使用parameterizedThreadStart委托执行带参数的委托 Thread th2 = newThread(Thread_param); th2.Start(20); #endregion } staticvoid Thread_param(object msg) { int message = (int)msg; Console.WriteLine("Result:{0}",message); }
运行结果
上面创建的线程是类型不安全的,那用什么样的方式执行带传入参数的线程的方法是类型安全的呢,http://www.caise8.com 答案就是创建一个自定义类,在类中定义一个作为传入参数的字段,将线程的主方法定义为一个类的实例方法。然而使用这种方法就可以使用泛型来解决使用ParameterizedThreadStart的类型不安全看招!!!!
class Program { staticvoid Main(string[] args) { #region使用自定义类实现带参数的线程 MyThread<string> mythread = new MyThread<string>("Thread_child"); Thread th3 = newThread(mythread.ThreadChild); th3.Start(); #endregion } } class MyThread<T> { private T data; public MyThread(T data) { this.data = data; } publicvoid ThreadChild() { Console.WriteLine("Child Thread Start! Result:{0}",data); }}
运行结果:
后台线程Thread类默认创建的是前台线程,所以我们前面创建的线程全部都是前台线程。只要有一个前台线程在运行,应用程序的进程就在运行。如果有多个前台线程在运行,而Main()方法(主线程)结束了,应用程序的进程就仍然是激活的,直到所有前台线程完成其任务为止。 那后台线程呢?显然和前台线程相反。当主线程结束后,应用程序的进程就终止了,在所有前台线程结束后,后台线程就会被终止。 在编码的时候我们可以设置Thread类的IsBackground的属性来确定该线程是前台线程还是后台线程。当IsBackground设置为False的时候,为前台线程,设置为Ture的时候为后台线程,下面我们举例来说明前台线程和后台线程的区别。首先我们创建一个前台线程。
staticvoid Main(string[] args) { Thread th_pre = new Thread(Thread_pre) {Name="Thread_pre",IsBackground=flase};; th_pre.Start(); Console.WriteLine("主线程执行完成!"); } staticvoid Thread_pre() { Console.WriteLine("子线程开始执行!"); Thread.Sleep(3000); Console.WriteLine("子线程执行完成!"); }
运行结果
从上面的运行结果可以看到,当主线程执行完成后,应用程序终止前就会子线程执行完成。 下面我们来看看后台线程,看代码!!
staticvoid Main(string[] args) {Thread th_back = newThread(Thread_back){ Name="Thread_back",IsBackground=true }; th_back.Start(); Console.WriteLine("主线程执行完成!"); } staticvoid Thread_back() { Console.WriteLine("子线程开始执行!"); Thread.Sleep(3000); Console.WriteLine("子线程执行完成!"); }
运行结果
从运行结果可以看出,当主线程结束后,进程就终止了,后台线程也被终止,所以没有后台线程结束的输出信息。控制线程 我们使用Thread创建线程后,我们需要对线程进行控制。1、 使用Start()方法使线程处于Running状态,线程开始执行。2、 使用Join()方法使线程处于WaitSleepJoin状态,在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止或经过了指定时 间为止。3、 使用Sleep()方法,也会使线程处于WaitSleepJoin状态,在经历Sleep()方法定义的时间段后,线程就会被再次唤醒。、4、 使用Abort()方法,会使线程处于ResetAbort()状态,线程在接到这个命令的时候,会抛出一个ThradAbordException类型的异常。各位看官,看代码
using System;using System.Text;using System.Threading;namespace ConsoleThreadContral{ class Program { staticvoid Main(string[] args) { Console.WriteLine("mainThread Start!"); Thread th = newThread(newThread); th.Start();//将当前实例的状态更改为 ThreadState.Running。 Console.WriteLine("newThread State:{0}",th.ThreadState); th.Join(100);//在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止或经过了指定时间为止。 Console.WriteLine("newThread State:{0}", th.ThreadState); th.Abort();//在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。 Console.WriteLine("newThread State:{0}", th.ThreadState); } staticvoid newThread() { Console.WriteLine("newThread Start!"); Thread.Sleep(10000); Console.WriteLine("newThread Complete!"); } }}
运行结果
相关文章推荐
- C#继承/this/base/new
- C#中Math.Round()实现中国式四舍五入
- C# Random 生成不重复随机数
- 【C#学习之辨析小总结】
- C#之日志
- C#学习——字符串
- c# 扩展方法 奇思妙想 推荐酷。
- StructLayout特性
- 关于C#托管代码与非托管代码的理解
- (转)C#程序开发中经常遇到的10条实用的代码
- C# WPF获取任务栏时间区域的Rectangle
- C# WPF 让你的窗口始终钉在桌面上
- [置顶]10年C#之旅,终获MVP,感谢博客园这个舞台。。。。。
- [置顶]群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法【附C#群蚁算法完整项目代码】
- [置顶]白话贝叶斯理论及在足球比赛结果预测中的应用和C#实现
- 【原创】C#搭建足球赛事资料库与预测平台(6) 赔率数据表设计2
- 【原创】机器学习之PageRank算法应用与C#实现(2)球队排名应用与C#代码
- 【原创】C#搭建足球赛事资料库与预测平台(5) 赔率数据表设计1
- 【原创】C#搭建足球赛事资料库与预测平台(4) 比赛信息数据表设计
- 【原创】C#搭建足球赛事资料库与预测平台(3) 基础数据表设计