一、基本概念
1、进程:进程是系统资源分配和资源调度的基本单位,每个独立执行的程序在系统中都是一个进程。如qq、word都是一个进程。
2、线程:线程是进程中的执行流程,一个进程中可以包含多个线程,每个线程也可以得到一个小段程序的执行时间。
二、线程管理
1、启动线程
Thread t1=new Thread(方法名);//创建一个线程
t1.Start();//启动该线程
2、线程休眠
多线程中,为了使某个线程暂停一段时间
Thread.Sleep(5000);//当前线程暂停5s
3、合并线程
join方法用于把指定的线程合并到当前线程。如果一个线程T1在执行过程中需要等待另个一个线程T2结束后才能继续执行。
Thread t1=new Thread(port1);//创建一个线程t1
t1.Start();//启动该线程
Thread t2=new Thread(port2);//创建一个线程t2
t2.Start();//启动该线程
void port1()
{
t2.Join();//中断线程1,执行线程2,等待线程2终止,线程1才能继续执行
}
void port1()
{
}
4、线程终止
if(t1.ThreadState==ThreadState.Running)//判断线程是否在执行
{
t1=Abort();//终止线程
}
5、线程的优先级
在多任务操作系统中,每个线程都会得到一小段CPU时间片进行执行,在时间结束时,将轮换另一个线程进入执行状态,这时会选择与当前线程优先级相同的进程进行执行。
如优先级下 :
线程5:线程A和线程B
线程4:线程C
...
线程1:线程D
执行过程:优先级为5的线程A首先的得到CPU时间片,当改时间结束后,轮换到与线程A相同优先级的线程B,当线程B的运行时间结束后,会继续轮换到线程A,当线程A和线程B 都执行完后,才会轮到执行线程B.
Thread t1=new Thread(port1);//创建一个线程t1
t1.Priority= ThreadPriority.Lowest;//设置优先级最低
t1.Start();//启动该线程
Thread t2=new Thread(port2);//创建一个线程t2
t2.Priority= ThreadPriority.Highest;//设置优先级最高
t2.Start();//启动该线程
6、线程同步机制
为了防止多线程中,发送两个线程抢占资源的问题,引入线程同步机制,线性同步指并发线程高效、有序的访问执行,所谓同步,是指某一时刻只有一个线程可以访问资源,只有资源所拥有者放弃了代码或资源的拥有权时,其他线程才可以使用这些资源。
(1)使用lock关键字实现线程同步
lock关键字可以用来确保代码完成运行,而不被其它线程中断。
Object thisLock =new Object();
lock(thisLock)//参数必须基于引用类型对象
{
//要运行的代码块
}
(2)使用monitor类实现线程同步
monitor类提供了通过向单个线程授予对象来控制对对象的访问,当一个线程拥有对象锁时,其它任何线程都不能获取该所。
Monitor.Enter(obj);//锁定代码块
{
//所要执行的代码块
}
Monitor.Exit(obj);//解锁代码块
三、线程参数传递
上面中创建的线程都不带参数,下面讨论如何传递参数。
参考:C# 多线程参数传递
1、通过实体类传递
//需要执行的线程
public class FunctionClass
{
public static string TestFunction(string name, int age)
{
return name + " 的年龄是:" + age;
}
}
//新建实体类
public class TransitionalClass
{
private string name = string.Empty;
private int age;
public string acceptResults = string.Empty;
public TransitionalClass(string name, int age)
{
this.name = name;
this.age = age;
}
public void TestFunction()
{
acceptResults = FunctionClass.TestFunction(this.name, this.age);
}
}
//执行线程
//实例化ThreadWithState类,为线程提供参数
TransitionalClass tc = new TransitionalClass(" Jack", 42);
// 创建执行任务的线程,并执行
Thread t = new Thread(new ThreadStart(tc.TestFunction));
t.Start();
//获取返回值,通过 tc.acceptResults;