进程是应用程序的运行实例,是应用程序的一次动态执行
一个进程是由多个线程所组成的,线程是程序执行的基本原子单位,一个进程可以由多个线程组成。线程是“进程”中某个单一顺序的控制流。
线程是进程中的一个基本执行流,每个线程都有自己专属的寄存器(程序计数器、栈指针等),代码区共享,不同的线程可以执行同样的函数。
多线程可以实现并行处理,避免了某项任务长时间占用cpu时间。需要注意的是,多线程程序对于效率应该根据任务不同的要求来选择:
如果两个非常活跃的线程为了抢夺对cpu的控制权,在线程切换时会消耗的cpu资源,反而会降低系统的性能。
在线程的相关知识中,Thread类是最重要的一个,所有起步的信息都包含在Thread类中。
Thread类提供了创建并控制线程,设置其优先级并获取其状态的方法。
该类包含在System.Threading命名空间中。如果想在自己的应用程序中使用多线程,就必须包含Thread类,而在使用Thread类之前,
需要使用using System.Threading;将命名空间包含进来。
Thread类中有4个重载的构造函数,使用最为广泛的是:
public Thread(ThreadStart start);
其参数是start,参数类型是System.Threadding ThreadStart,ThreadStart委托,它表示此线程开始执行时要调用的方法。
需要注意的是,在创建线程时,在该线程上执行的方法将通过一个传递给Thread构造函数的ThreadStart委托来表示。
在调用Start方法之前,该线程不会开始执行
demo1:
class ThreadSimple
{
//静态线程函数
public static void ThreadMethodExample()
{
}
}
//此时就可以调用该静态方法了
Thread ThreadSimple=new Thread(ThreadSimple.ThreadMethodExample)
在实际的代码编写时,还可以使用更加简单的线程定义方式:
Thread ThreadSimple=new Thread(new ThreadStart(ThreadMethodExample));
以上两种方式的效果是完全一样的,第二种方式写出的程序更加简洁
在Thread中提供了Start方法,通过调用该方法,就可以启动线程。
启动线程:即新建并启动一个线程的代码:
ThreadSimple.Start();
Thread类有以下较为常用的实例成员:
IsAlive:判断线程是否处于活动状态
Name:线程的名称
Priority:ThreadPriority枚举类型,代表线程的优先级
ThreadState:ThreadState枚举类型,代表线程的状态
Start:启动一个线程
Suspend:挂起一个线程的运行
Resume:继续挂起的线程
Abort:结束一个线程的运行
当线程创建完毕并启动之后,控制线程的工作还有以下几件事需要完成:
线程的优先级:ThreadPriority属性用于设置线程的级别。在枚举类型ThreadPriority中定义了以下成员,分别对应一种线程级别
Normal:普通级别
AboveNormal:高于普通级别
BelowNormal:低于普通级别
Highest:最高级别
Lowest:最低级别
下面的语句将线程的级别设置成了最高:
ThreadSimple.priority=ThreadPriority.Highest;
线程的休眠:休眠线程是让线程进入一定时间的休眠状态,时间一到,线程将继续运行。这可以通过Thread的Sleep方法实现。
Thread类中有两个重载的Sleep方法:
一个带有int类型的参数,指定休眠的毫秒数;Thread.Sleep(10000);//休眠10秒
另一个带有TimeSpan类型的参数,指定休眠的时间段。Thread.Sleep(new TimeSpan(0,0,0,0,10000));//休眠10秒
线程的挂起:和休眠不同,线程的挂起是暂停线程,如果不再启动线程,它将永远保持暂停状态。只有当前运行的线程才可以挂起,
对已经挂起的线程实施挂起操作没有任何效果。
//如果线程的状态是运行
if(NewThread.ThreadState==ThreadState.Running)
{
//线程挂起
NewThread.Suspend();
}
线程的继续:挂起的线程可以使用Thread.Resume方法继续运行,对没有挂起的线程使用继续操作将没有任何结果。
//如果线程的状态是挂起
if(NewThread.ThreadState==ThreadState.Suspended)
{
//线程继续
NewThread.Resume();
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace SubThread
{
class SubThread
{
public void SubThreadFunc()
{
int i = 0;
do
{
i++;
Console.WriteLine("子线程正在运行……{0}", i);
}
while(1==1);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("子线程启动、停止、终止、阻塞等");
//创建ThreadS,演示SubThread类的SubThreadFunc方法
SubThread sThread = new SubThread();
Thread threadS = new Thread(new ThreadStart(sThread.SubThreadFunc));
Console.WriteLine("子线程启动");
threadS.Start();
Console.WriteLine("子线程状态---------------{0}",threadS.ThreadState);
//主线程休眠200毫秒
Thread.Sleep(200);
Console.WriteLine("主线程休眠200毫秒");
//线程终止
threadS.Abort();
Console.WriteLine();
Console.WriteLine("子线程状态-------{0}", threadS.ThreadState);
Console.WriteLine("子线程终止");
Console.WriteLine("sThread.SubThreadFunc()被终止");
try
{
threadS.Start();
Console.WriteLine("尝试启动sThread.SubThreadFunc()");
}
catch (ThreadStateException)
{
Console.WriteLine("sThread.SubThreadFunc()已经终止线程,不能被重新启动");
Console.WriteLine("子线程状态-------{0}", threadS.ThreadState);
Console.ReadKey();
}
return;
}
}
}
效果: