基础知识:
线程与线程对象
多线程程序在忙于处理数据的时候仍然能响应用户操作。
线程是操作系统分配CPU的基本单元,操作系统会使用调度算法把多个线程分给多个核心来执行
程序可以把分割出来的工作封装成一个函数,由线程负责执行
每一个线程一定对应着一个线程函数,线程的运行过程与线程函数执行过程一一对应
Public Thread(ThreadStart start);
线程函数的要求:必须要返回void
Thread th1=new Thread(func);
线程对象创建之后调用Start
方法开始,代码执行完毕之后线程结束
程序启动的第一个线程称为主线程,主线程会负责启动其他的线程
在线程函数中使用Thread.CurrentThread
可以获取负责执行此函数的线程对象引用
每个线程都有一个ID,线程对象的ManagedThreadID
属性保存了这个值
线程暂停——Thread.Sleep(Time);
Thread.SpinSleep(Time)
可以让CPU空转,但是线程状态不改变
Abort
方法可以提前终止线程——注意,需要加上异常捕获结构,捕获ThreadAbout
异常,Thread.ResetAbort();
实际开发中一般不用Abort
提前终止线程
背景线程
IsBackground
属性:
当主线程结束的时候,背景线程自动终止
默认创建的都是前台线程,CLR会等到所有前台线程都结束的时候才会结束整个进程
Thread
类的Join
方法可以让一个线程等待另一个线程结束(线程同步)
Th.Start();
Th.Join();
相当于把B的流程“嵌入”到A里
注意如果使用不当容易造成死锁
dotNet的线程属于“托管线程”,由CLR进行调度(操作系统直接调度的线程称为物理线程)
dotNet提供的线程状态比操作系统线程状态多
辅助线程状态切换:
Unstart
Running
Stopped
代码演示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Chap4_1_Thread
{
public class MyClass
{
public static void StaticMethod()
{
Console.WriteLine("线程{0}执行MyClass.StaticMethod", Thread.CurrentThread.ManagedThreadId);
}
public void InstanceMethod()
{
Console.WriteLine("线程{0}执行MyClass.InstanceMethod", Thread.CurrentThread.ManagedThreadId);
}
}
class Program
{
static void ThreadAMethod()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("辅助线程正在执行:" + i.ToString());
Thread.Sleep(200);
}
Console.WriteLine("辅助线程执行结束");
}
static void Main(string[] args)
{
Console.WriteLine("main thread ID:{0}", Thread.CurrentThread.ManagedThreadId);
MyClass obj = new MyClass();
Thread th1 = new Thread(new ThreadStart(MyClass.StaticMethod));
Thread th2 = new Thread(new ThreadStart(obj.InstanceMethod));
//ThreadStart是一个委托
Thread th3 = new Thread(MyClass.StaticMethod);
//简化写法
th1.Start();
th2.Start();
th3.Start();
//用Start方法开始执行线程
Console.WriteLine("主线程{0}任务执行完毕,敲任意键退出", Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
//以下为线程的睡眠
Thread sleeper = new Thread(()=>{
for (int i = 0; i <10; i++)
{
Thread.Sleep(100);
Console.WriteLine("第{0}次睡眠", i);
}
});
sleeper.Start();
Console.WriteLine("睡眠结束");//注意主线程和sleeper是并行运行的
Console.ReadKey();
//使用join方法让主线程等待子线程
Console.WriteLine("join方法演示");
Thread waiting = new Thread(ThreadAMethod);
waiting.Start();
waiting.Join();
Console.WriteLine("主线程结束");
Console.ReadKey();
//线程状态
Console.WriteLine("显示线程状态");
Thread status = new Thread(() =>
{
Console.WriteLine(Thread.CurrentThread.ThreadState);
});
Console.WriteLine(status.ThreadState);
status.Start();
status.Join();
Console.WriteLine(status.ThreadState);
Console.ReadKey();
}
}
}