一、线程常用属性
属性名称 | 说明 |
---|---|
CurrentContext | 获取线程正在其中执行的当前上下文。 |
CurrentThread | 获取当前正在运行的线程。 |
ExecutionContext | 获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。 |
IsAlive | 获取一个值,该值指示当前线程的执行状态。 |
IsBackground | 获取或设置一个值,该值指示某个线程是否为后台线程。 |
IsThreadPoolThread | 获取一个值,该值指示线程是否属于托管线程池。 |
ManagedThreadId | 获取当前托管线程的唯一标识符。 |
Name | 获取或设置线程的名称。 |
Priority | 获取或设置一个值,该值指示线程的调度优先级。 |
ThreadState | 获取一个值,该值包含当前线程的状态。 |
①ManagedThreadId是确认线程的唯一标识符,程序在大部分情况下都是通过Thread.ManagedThreadId来辨别线程的。而Name是一个可变值,在默认时候,Name为一个空值 Null,开发人员可以通过程序设置线程的名称,但这只是一个辅助功能。
②线程的优先级别
当线程之间争夺CPU时间时,CPU按照线程的优先级给予服务。高优先级的线程可以完全阻止低优先级的线程执行。.NET为线程设置了Priority属性来定义线程执行的优先级别,里面包含5个选项,其中Normal是默认值。除非系统有特殊要求,否则不应该随便设置线程的优先级别。
成员名称 | 说明 |
---|---|
Lowest | 可以将 Thread 安排在具有任何其他优先级的线程之后。 |
BelowNormal | 可以将 Thread 安排在具有 Normal 优先级的线程之后,在具有 Lowest 优先级的线程之前。 |
Normal | 默认选择。可以将 Thread 安排在具有 AboveNormal 优先级的线程之后,在具有BelowNormal 优先级的线程之前。 |
AboveNormal | 可以将 Thread 安排在具有 Highest 优先级的线程之后,在具有 Normal 优先级的线程之前。 |
Highest | 可以将 Thread 安排在具有任何其他优先级的线程之前。 |
③线程的状态
通过ThreadState可以检测线程是处于Unstarted、Sleeping、Running 等等状态,它比 IsAlive 属性能提供更多的特定信息。
前面说过,一个应用程序域中可能包括多个上下文,而通过CurrentContext可以获取线程当前的上下文。
CurrentThread是最常用的一个属性,它是用于获取当前运行的线程。
④System.Threading.Thread的方法
Thread 中包括了多个方法来控制线程的创建、挂起、停止、销毁,以后来的例子中会经常使用。
方法名称 | 说明 |
---|---|
Abort() | 终止本线程。 |
GetDomain() | 返回当前线程正在其中运行的当前域。 |
GetDomainId() | 返回当前线程正在其中运行的当前域Id。 |
Interrupt() | 中断处于 WaitSleepJoin 线程状态的线程。 |
Join() | 已重载。 阻塞调用线程,直到某个线程终止时为止。 |
Resume() | 继续运行已挂起的线程。 |
Start() | 执行本线程。 |
Suspend() | 挂起当前线程,如果当前线程已属于挂起状态则此不起作用 |
Sleep() | 把正在运行的线程挂起一段时间。 |
线程示例:
using System;
using System.Threading;
namespace Study_ThreadDemo
{
class Program
{
static void Main(string[] args)
{
//获取正在运行的线程
Thread thread = Thread.CurrentThread;
//1、设置线程的名称
thread.Name = "主线程";
//2、获取当前线程的唯一标识符
int id = thread.ManagedThreadId;
//3、获取当前线程的状态
ThreadState state = thread.ThreadState;
//4、获取当前新城的优先级
ThreadPriority priority = thread.Priority;
string curThreadInfo = string.Format("当前线程ID:{0}\n"+"线程名称:{1}\n"+
"线程状态:{2}\n"+"线程优先级:{3}\n",id,thread.Name,state,priority);
Console.WriteLine(curThreadInfo);
Console.ReadKey();
}
}//Class_end
}
运行结果如下所示:
二、 前台线程和后台线程
①前台线程:只有所有的前台线程都结束,应用程序才能结束。默认情况下创建的线程都是前台线程
②后台线程:只要所有的前台线程结束,后台线程自动结束。通过Thread.IsBackground设置后台线程。必须在调用Start方法之前设置线程的类型,否则一旦线程运行,将无法改变其类型。
通过BeginXXX方法运行的线程都是后台线程。
using System;
using System.Threading;
namespace Study_ThreadDemo
{
class Program
{
static void Main(string[] args)
{
//演示前台线程
BackGroudThreadTest backGroud = new BackGroudThreadTest(10);
//创建前台线程
Thread frontThread = new Thread(new ThreadStart(backGroud.RunLoop));
//给线程命名
frontThread.Name = "前台线程";
BackGroudThreadTest background1 = new BackGroudThreadTest(20);
//创建后台线程
Thread bThread = new Thread(new ThreadStart(background1.RunLoop));
bThread.Name = "后台线程";
//设置为后台线程
bThread.IsBackground = true;
//启动线程
frontThread.Start();
bThread.Start();
}
}//Class_end
class BackGroudThreadTest
{
private int count = 0;
//构造函数
public BackGroudThreadTest(int count)
{
this.count = count;
}
public void RunLoop()
{
//获取当前线程的名称
string threadName = Thread.CurrentThread.Name;
for (int i = 0; i < count; i++)
{
Console.WriteLine("{0}计数:{1}",threadName,i.ToString());
//线程休眠500毫秒
Thread.Sleep(500);
}
Console.WriteLine("{0}完成计数",threadName);
}
}//Class_end
}
运行结果:前台线程执行完,后台线程未执行完,程序自动结束。
把bThread.IsBackground = true注释掉,运行结果:主线程执行完毕后(Main函数),程序并未结束,而是要等所有的前台线程结束以后才会结束。
后台线程一般用于处理不重要的事情,应用程序结束时,后台线程是否执行完成对整个应用程序没有影响。如果要执行的事情很重要,需要将线程设置为前台线程。
注意:本文内容来自https://www.cnblogs.com/dotnet261010/p/6159984.html