赞
踩
打开任务管理器,查看当前运行的进程
在任务管理器里面查询当前总共运行的线程数
举例:主线程执行
- internal class ThreadTest
- {
- static void Main(string[] args)
- {
- Thread th = Thread.CurrentThread;
- th.Name = "MainThread";
- Console.WriteLine("线程ID是:{0},线程名称是:{1}", th.ManagedThreadId, th.Name);
- }
- }
输出结果
线程ID是:1,线程名称是:MainThread
线程是通过扩展 Thread 类创建的,然后在构造方法中传入委托对象。扩展的 Thread 类调用 Start() 方法来开始子线程的执行
- internal class ThreadTest
- {
- static void Main(string[] args)
- {
- // 创建两个子线程
- Thread t1 = new Thread(new ThreadStart(PrintStr));
- Thread t2 = new Thread(new ThreadStart(PrintStr));
- t1.Start();
- t2.Start();
- }
-
- private static void PrintStr()
- {
- Thread th = Thread.CurrentThread;
- Console.WriteLine("线程ID是:{0}", th.ManagedThreadId);
- }
-
- }
输出结果
- 线程ID是:7
- 线程ID是:6
通过ThreadStart 源码,可以看到它其实是一个委托
- internal class ThreadTest
- {
- static void Main(string[] args)
- {
- // 创建两个子线程
- Thread t1 = new Thread(new ParameterizedThreadStart(PrintStrParam));
- Thread t2 = new Thread(new ParameterizedThreadStart(PrintStrParam));
- t1.Start("我是有参数1");
- t2.Start("我是有参数2");
- }
-
- private static void PrintStrParam(Object obj)
- {
- Thread th = Thread.CurrentThread;
- Console.WriteLine("线程ID是:{0},参数是:{1}", th.ManagedThreadId,obj);
- }
-
- }
输出结果
- 线程ID是:6,参数是:我是有参数1
- 线程ID是:7,参数是:我是有参数2
Thread 类提供了各种管理线程的方法,下面演示sleep() 方法的使用,用于在一个特定的时间暂停线程
Abort() 方法用于销毁线程;通过抛出 threadabortexception 在运行时中止线程。这个异常不能被捕获,如果有 finally 块,控制会被送至 finally 块。 注:这个方法被标记过时了,虽然依旧可以使用,但推荐使用 CancellationToken 来代替
- internal class ThreadTest
- {
- static void Main(string[] args)
- {
- // 创建两个子线程
- Thread t1 = new Thread(new ThreadStart(printSleep));
- t1.Start();
- // 主线程睡眠 1 秒
- Thread.Sleep(1000);
-
- // 销毁线程
- try
- {
- t1.Abort();
- }
- catch (ThreadAbortException e)
- {
- Console.WriteLine("进catch了吗???");
- }
- finally
- {
- Console.WriteLine("进finally了吗???");
- }
- }
-
- private static void printSleep()
- {
- for (int i = 0; i < 10; i++)
- {
- // 睡眠 500 毫秒
- Thread.Sleep(500);
- Console.WriteLine("输出数字:{0}", i);
- }
- }
-
- }
输出结果
- 输出数字:0
- Unhandled exception. 输出数字:1
- System.PlatformNotSupportedException: Thread abort is not supported on this platform.
- 输出数字:2
- 进finally了吗???
lock
块语法:lock
块的参数不能是值类型和string
类型,必须是除了string
外的引用类型,而且这个引用类型对象必须是所有线程都能访问到的,否则锁不住。object
对象来作为指定的锁对象- lock(expression)
- {
- // 代码逻辑
- }
加锁前案例
- internal class ThreadTest
- {
- static void Main(string[] args)
- {
- PhoneSale phone=new PhoneSale();
-
- // 创建两个子线程
- Thread t1 = new Thread(new ThreadStart(phone.SalePhone));
- Thread t2 = new Thread(new ThreadStart(phone.SalePhone));
- t1.Start();
- t2.Start();
- }
-
- }
-
- public class PhoneSale
- {
- // 数量
- private int num = 1;
-
- public void SalePhone()
- {
- if (num > 0)
- {
- Thread.Sleep(100);
- num--;
- Console.WriteLine("卖出一部手机,还剩下 {0} 个",num);
- }
- else
- {
- Console.WriteLine("卖完了....");
- }
- }
-
- }
输出结果
- 卖出一部手机,还剩下 0 个
- 卖出一部手机,还剩下 -1 个
加锁后案例
- internal class ThreadTest
- {
- static void Main(string[] args)
- {
- PhoneSale phone=new PhoneSale();
-
- // 创建两个子线程
- Thread t1 = new Thread(new ThreadStart(phone.SalePhone));
- Thread t2 = new Thread(new ThreadStart(phone.SalePhone));
- t1.Start();
- t2.Start();
- }
-
- }
-
- public class PhoneSale
- {
- // 数量
- private int num = 1;
-
- public void SalePhone()
- {
- lock (this)
- {
- if (num > 0)
- {
- Thread.Sleep(100);
- num--;
- Console.WriteLine("卖出一部手机,还剩下 {0} 个", num);
- }
- else
- {
- Console.WriteLine("卖完了....");
- }
- }
- }
- }
输出结果
- 卖出一部手机,还剩下 0 个
- 卖完了....
为什么程序可以多线程执行呢? 程序中的多线程与CPU的多线程有什么关系?
更多**好看的内容**和**好玩的案例**请关注**我的微信公众号: 程序猿知秋**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。