1.C#对线程进行操做时,经过Thread类,能够对线程进行建立、挂起、恢复、休眠、终止及设置优先级。安全
Thread类位于System.Threading命名空间下,该命名空间还包含一个ThreadPool类(容许用户使用系统提供的线程池)和一个Timer类(在线程池上执行回调方法) 函数
在线程运行期间,不一样的时刻会表现为不一样的状态,但它老是处于由ThreadState定义的一个或多个状态中。用户能够经过使用ThreadPriority枚举为线程定义优先级,但不能保证操系统会接收该优先级操作系统
2.Thread类经常使用的属性: .net
CurrentThread 获取当前正在运行的线程线程
IsAlive 获取一个值,该值只是当前线程的执行状态3d
Name 获取或设置线程的名称orm
Priority 获取或设置一个值,该值只是线程的调度优先级 对象
ThreadState 获取一个值,该值包含当前线程的状态blog
3.Thread类经常使用的方法: 进程
Abort 调用此方法一般会终止线程
Join 阻止调用线程,直到某个线程终止时为止
Resume 继续已挂起的线程
Sleep 将当前线程阻止指定的毫秒数
Start 使线程被安排进行执行
Suspend 挂起线程,或者若是线程已挂起,则不起做用
4.建立线程--Start()方法
建立一个线程,只需将其声明并为其提供线程起始点处的方法委托。
Thread类具备接受一个ThreadState委托或ParameterizedThreadStart委托的构造函数,该委托包装了调用Start方法时由新线程调用的方法。
只有在调用Start方法后才会建立实际的线程。Start方法的 两种重载方式 :
(1)致使操做系统将当前实例的状态更改成ThreadState.Running
语法: public void Start()
说明:该方法无参数,无返回值
(2)使操做系统当前实例的状态更改成 ThreadState.Running,并选择线程执行所须要的方法
语法: public void Start(Object parameter)
说明:参数parameter表示一个对象,包含线程执行的方法要使用的数据
注意:若是线程已经终止,就没法经过再次调用Start方法来从新启动
5.线程的挂起与恢复--Suspend方法和Resume方法
(1)Suspend方法
该方法用来挂起线程,若是线程已经挂起则不起做用
语法:public void Suspend()
说明:调用Suspend方法挂起线程时,.net容许要挂起的线程再执行几个指令,目的是为了到达.net认为线程能够安全挂起的状态
(2)Resume方法
该方法用来继续已挂起的线程
语法:public void Resume()
说明:经过Resume方法来恢复被暂停的线程是,不管调用了多少次Suspend方法,调用Resume方法均会使另外的线程脱离挂起状态,并致使当前线程继续执行
6.线程休眠--Sleep()方法
该方法用来将当前线程阻止指定的时间,有 两种重载方式
(1)将当前线程挂起指定的时间
语法: public static void Sleep(int millisecondsTimeout)
说明:参数 millisecondsTimeout表示线程被阻止的毫秒数,指定零以指示应挂起此线程以使其余等待线程可以执行;指定Infinite以无限期阻止线程
(2)将当前线程阻止指定的时间
语法: public static void Sleep(TimeSpan timeout)
说明:参数timeout表示线程被阻止的时间量的TimeSpan,指定零以指示应挂起此线程以使其余等待线程可以执行;指定Infinite以无限期阻止线程
7.终止线程
终止线程能够分别使用Abort方法和Join方法实现
(1)Abort方法
用来终止线程,有 两种重载形式 ,都是引起的ThreadAbortExecption
public void Abort()--终止进程
public void Abort(Object stateInfo)--终止线程并提供有关线程终止的异常信息
参数stateInfo是一个对象,包含应用程序特定的信息(如状态),该信息可供正被终止的线程使用
(2)Join方法
Join用来阻止调用线程,直到某个线程终止时为止。有 三种重载形式
public void Join()
public bool Join(int millisecondsTimeout)
说明:参数 millisecondsTimeout表示等待线程终止的毫秒数。若是线程已终止,则返回值为true,若是线程通过了 millisecondsTimeout指定时间后未终止,返回值为false
public bollJoin(TimeSpan timeout)
说明:参数 timeout表示等待线程终止的时间量TimeSpan。若是线程已终止,则返回值为true,若是线程通过 timeout时间量以后未终止,则返回值为false
8.线程的优先级
AboveNormal 能够将Thread安排在具备highest优先级线程以后,在Normal以前
BelowNormal 在Normal以后,Lowest以前
Highest 在具备任何其余优先级的线程以前
Lowest 在具备其余任何优先级的线程以后
Normal 在AboveNormal以后,BelowNormal以前。默认值。
能够经过调用线程的Priority属性来获取和设置其优先级。Priority属性用来获取或设置一个值,该值指示线程的调度优先级。
语法:public ThreadPriority Priority{get;set;}
说明:属性值是ThreadPriority枚举值之一,默认值为Normal。
实例代码:
static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(Thread1)); //使用自定义方法Thread1声明线程
thread1.Priority = ThreadPriority.Lowest; //设置线程的调度优先级
Thread thread2 = new Thread(new ThreadStart(Thread2)); //使用自定义方法Thread2声明线程
thread1.Start(); //开启线程一
thread2.Start(); //开启线程二
Console.ReadLine();
} static void Thread1()
{
Console.WriteLine("线程一");
} static void Thread2()
{
Console.WriteLine("线程二");
}
运行截图:
注意:这里不少人都疑惑了,既然thread1优先级比thread2优先级低,为何仍是先输出的thread1的内容呢?
其实那是由于你不了解线程的优先级实现原理 线程的优先级并非你想象的先执行哪一个后执行哪一个 而是全部的线程不论优先级高低都会执行, 优先级越高表示CPU分配给该线程的时间片越多,执行时间就多 优先级越低表示CPU分配给该线程的时间片越少,执行时间就少