线程生命周期(来源 w3cschool)
- 未启动状态:当线程实例被创建但 Start 方法未被调用时的状况。
- 就绪状态:当线程准备好运行并等待 CPU 周期时的状况。
-
不可运行状态:
- 已经调用 Sleep 方法
- 已经调用 Wait 方法
- 通过 I/O 操作阻塞
- 死亡状态:当线程已完成执行或已中止时的状况。
Thread 常用方法:
- public void Interrupt() 中断处于 WaitSleepJoin 线程状态的线程。
- public void Join() 在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止为止。
- public void Start() 开始一个线程
- public static void Sleep(int millisecondsTimeout) 让线程暂停一段时间
一 普通线程
分为两种,一种是不需要给子线程传参数,Thread t = new Thread(new ThreadStart(void () target)); 另一种是要给子线程传一个参数,Thread t = new Thread(new ParameterizedThreadStart(void (object) target));
1 // 普通线程 2 private void btn1_Click(object sender, EventArgs e) 3 { 4 progressBar.Value = 0; 5 Thread tt = new Thread(new ThreadStart(DoWork1)); 6 tt.Name = "不带参数普通线程"; 7 tt.Start(); 8 Thread t = new Thread(new ParameterizedThreadStart(DoWork2)); 9 t.Name = "带参数普通线程"; 10 t.IsBackground = true; 11 t.Start(100); 12 _msg += "当前线程的执行状态:" + t.IsAlive + "\r\n"; 13 _msg += "当前托管线程的唯一标识:" + t.ManagedThreadId + "\r\n"; 14 _msg += "线程名称:" + t.Name + "\r\n"; 15 _msg += "当前线程的状态:" + t.ThreadState; 16 MessageBox.Show("消息:\r\n" + _msg, "提示", MessageBoxButtons.OK); 17 } 18 // 线程方法 19 private void DoWork1() 20 { 21 for (int i = 0; i < 100; i++) 22 { 23 // 跨线程访问 UI,BeginInvoke 采用异步委托 24 progressBar.BeginInvoke(new EventHandler((sender, e) => 25 { 26 progressBar.Value = i; 27 }), null); 28 } 29 } 30 // 线程方法 31 private void DoWork2(object obj) 32 { 33 for (int i = 0; i < (int)obj; i++) 34 { 35 progressBar.BeginInvoke(new EventHandler((sender, e) => 36 { 37 progressBar.Value = i; 38 }), null); 39 } 40 } 41