Thread 创建和控制线程,设置其优先级并获取其状态
Thread构造函数接收一个无参数或带一个object类型参数的委托
1 { 2 Console.WriteLine("********ManagedThreadId:{0} {1}********", Thread.CurrentThread.ManagedThreadId.ToString("00"), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); 3 ParameterizedThreadStart method = o => NoReturnWithParamater(o); 4 Thread thread = new Thread(method); 5 thread.Start("123");//开启线程,执行委托的内容 6 } 7 { 8 ThreadStart method = DoSomeThing; 9 Thread thread = new Thread(method); 10 thread.Start();//开启线程,执行委托的内容 11 thread.Suspend();//暂停 12 thread.Resume();//恢复 13 //thread.Abort(); 14 //线程是计算机资源,程序想停下线程,只能向操作系统通知(线程抛异常), 15 //会有延时/不一定能真的停下来 16 Thread.ResetAbort(); 17 //1等待 18 while (thread.ThreadState != System.Threading.ThreadState.Stopped) 19 { 20 Thread.Sleep(200);//当前线程休息200ms 21 } 22 //2 Join等待 23 thread.Join();//运行这句代码的线程,等待thread的完成 24 thread.Join(1000);//最多等待1000ms 25 }
线程操作
1、Start() 使线程处于Running状态,线程开始执行
2、Suspend() 挂起线程,或者如果线程已挂起,则不起作用
3、Resume() 继续执行已挂起的线程
4、Abort()、Abort(Object) 调用此方法通常会终止线程
5、ResetAbort() 取消当前线程所请求的 Abort(Object)
6、Sleep(Int32)、Sleep(TimeSpan) 将当前线程挂起指定的时间
7、Join()、Join(Int32)、Join(TimeSpan) 在继续执行程序,阻止调用线程,直到由该实例表示的线程终止或经过了指定时间为止
前后台线程
区别是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束
可以通过设置 IsBackground 属性来更改
1 public static void threadMethod() 2 { 3 Thread.Sleep(3000); 4 } 5 Thread thread = new Thread(threadMethod); 6 // thread.IsBackground = true; 7 thread.Start()
如果运行上面的代码,程序会等待3秒后退出,如果将注释去掉,将thread设成后台线程,则程序会立即退出
要注意的是,必须在调用Start方法之前设置线程的类型,否则一但线程运行,将无法改变其类型
一般通过Begin...方法运行的线程都是后台线程
线程优先级
高优先级,优先执行,但不代表优先完成 甚至说某些情况下,还有意外发生,不能通过这个来控制线程的执行先后顺序,因为操作系统不需要遵循线程的优先级,线程是计算机资源,程序操作线程,只能向操作系统通知,会有延时/不一定能真的执行
微软文档:
Thread:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.thread?view=netframework-4.8