C#多线程学习之Thread
2013-08-29 17:32
344 查看
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ThreadTest { class Program { static void DoWork() { Console.WriteLine("DoWork is begin"); for (int i = 0; i < 10; i++) { try { if (i == 7) { //终止线程,会抛出一个ThreadAbortException 类型的异常 Thread.CurrentThread.Abort(i); } Console.WriteLine(string.Format("{0} {1}", Thread.CurrentThread.Name, i)); Thread.Sleep(300); } catch (ThreadAbortException e) { Console.WriteLine(string.Format("{0} is Abort when i is {1}", Thread.CurrentThread.Name, e.ExceptionState)); //取消终止,静态方法 Thread.ResetAbort(); } } Console.WriteLine("DoWork is end"); } /// <summary> /// /// </summary> /// <param name="args"></param> static void Main(string[] args) { Console.WriteLine("Main thread begin"); #region Thread类构造函数的参数是:不带参数的静态方法 Thread myThread1 = new Thread(Program.DoWork); myThread1.Name = "thread1"; /* * 有关前台线程和后台线程 * 线程Thread有一个属性IsBackground,通过把此属性设置为true,就可以把线程设置为后台线程! * 当一个进程除了主线程之外其他线程都是后台线程时,应用程序域将在主线程完成时就被卸载,而不会等待异步线程的运行。 * 使用Thread.Start()启动的线程默认为前台线程,而系统必须等待所有前台线程运行结束后,应用程序域才会自动卸载。 */ //设置为后台线程 myThread1.IsBackground = true; myThread1.Start(); #endregion #region Thread类构造函数的参数是:带参数的非静态方法 string str = string.Format("test"); Test myTest = new Test(); //如果Thread的构造函数的参数是带参数的方法,则这个参数要求是object类型 Thread myThread2 = new Thread(myTest.ShowMessage); myThread2.Name = "thread2"; //设置为前台线程,默认为前台线程 myThread2.IsBackground = false; myThread2.Start(str); /* * thread线程间的同步:join方法 * * 关于对 Thread类实例的Join方法的理解. * 两个线程的关系如下:一个线程(旧的)生成并启动另一个线程(新的). * join方法只能在以下条件被调用:一个新的线程被创建并且调用start方法后. * join方法的作用:阻塞。在旧的线程代码里,运行到行新线程实例的join方法时,旧线程将会被阻塞, * 直到新线程(不管是前台还是后台线程)执行完成后,旧线程才会继续执行join方法后面的代码。 * * 比喻如下:线程A创建了线程B和线程C并且都调用start方法启动了线程B和C,线程A才能调用线程B和C的join方法, * 表示线程A将阻塞等到线程B和C执行完之后再继续执行。但线程B和C之间是不用通过join方法来通信或者同步的。 * * 在本例里,main线程是主线程,创建线程myThread1和myThread2并都启动了,在执行到myThread2.Join();代码时, * 主线程main线程将被阻塞,直到myThread2线程执行完之后,再继续执行 * */ myThread2.Join(); #endregion //其他:Suspend 与 Resume 方法分别表示挂起和恢复线程,已过时,微软不建议继续使用,不做介绍。 Console.WriteLine("Main thread end"); Thread.Sleep(2000); // Console.ReadKey(); } } class Test { //要作为Thread的构造函数的参数,则这个参数要求是object类型 public void ShowMessage(object obj) { Console.WriteLine("ShowMessage is begin"); string str = obj as string; for (int i = 0; i < 10; i++) { Console.WriteLine(string.Format("{0} {1}{2}", Thread.CurrentThread.Name,str, i)); Thread.Sleep(500); } Console.WriteLine("ShowMessage is end"); } } }
相关文章推荐
- C# 多线程学习(六)线程池(ThreadPool)——线程资源的复用和自动管理
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
- [C#学习笔记之多线程1]使用ParameterizedThreadStart委托向线程函数传送参数
- C#学习之多线程开发技术(十)
- 一步一步学习C#多线程知识
- 多线程基础学习一:Thread基础学习
- Java多线程学习 (三) Thread的wait()方法执行
- c# 多线程学习笔记 (一)基本概念
- 【python标准库学习】thread,threading(一)多线程的介绍和使用
- python进阶学习笔记(四)--多线程thread
- C#学习常用类(2000)---Thread类(前台与后台线程)
- java多线程学习——(1)认识Thread和Runnable
- C# - 多线程 之 Process与Thread与ThreadPool
- Android 学习 之 Looper Handler Thread Messahe 多线程
- C# 多线程编程 - 使用Thread类创建线程
- C#中的多线程使用 -- Thread 类
- C#多线程学习(五) 多线程的自动管理(定时器)
- 一步一步学习C#中的多线程 --- 1、初识线程(2)--给线程传递参数
- 【C#多线程】C#多线程 Thread 开发基础