C# Thread类 线程优先级
1.C#对线程进行操作时,通过Thread类,可以对线程进行创建、挂起、恢复、休眠、终止及设置优先级。
Thread类位于System.Threading命名空间下,该命名空间还包含一个ThreadPool类(允许用户使用系统提供的线程池)和一个Timer类(在线程池上执行回调方法)
在线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中。用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操系统会接收该优先级
2.Thread类常用的属性:
CurrentThread 获取当前正在运行的线程
IsAlive 获取一个值,该值只是当前线程的执行状态
Name 获取或设置线程的名称
Priority 获取或设置一个值,该值只是线程的调度优先级
ThreadState 获取一个值,该值包含当前线程的状态
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分配给该线程的时间片越少,执行时间就少
C# Thread类 线程优先级的更多相关文章
- Thread类(线程)
操作系统通过线程对程序的执行进行管理,当操作系统运行一个程序的时候,首先,操作系统将为这个准备运行的程序分配一个进程,以管理这个程序所需要的各种资源.在这些资源之中,会包含一个称为主线程的线程数据结构 ...
- Thread类线程结束会唤醒使用其对象做锁而睡眠的线程
首先回顾一下我们的基础知识. sleep: 线程睡眠,不会释放锁 wait: 线程等待.释放锁. notity: 唤醒随机一个当前对象等待的线程,并不会释放锁 notityAll: 唤醒所有当前对象等 ...
- java 多线程:Thread类常用方法:setPriority优先级、interrupt中断标记、suspend暂停与唤醒resume(已过时);daemon守护线程
常用方法: boolean isAlive() 测试此线程是否存活. boolean isDaemon() 测试此线程是否为守护程序线程. static void sleep?(long millis ...
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)
实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...
- Java多线程01(Thread类、线程创建、线程池)
Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...
- 并发基础(六) 线程Thread类的start()和run()
start()和run()方法对于刚接触线程的人来说,会有点混淆,有点难理解,一般都会有以下疑问: 一.start( )方法 1.为什么需要start方法:它的作用是什么: start方法的作用就是将 ...
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- 线程操作之Thread类
在.Net fremework 中,所有与线程有关的操作都封装在System.Thread命名空间中, 所以在操作线程时,要先引入次命名空间 Thread类的常用方法 Abort 线程终止 Join ...
随机推荐
- play 学习 一 : 构建SBT的play项目
因为帮一个朋友做一个简单的项目,档案管理.同时也为了自己能学习PLay框架,所以记录一下. 项目GitHub地址: https://github.com/liufeiSAP/ArchiveManage ...
- C语言学习笔记--C语言中的逗号表达式
逗号表达式:exp1,exp2,epx3,...,expN; (1)逗号表达式是 C 语言中的“粘贴剂” (2)逗号表达式用于将多个子表达式连接为一个表达式 (3)逗号表达式的值为最后一个子表达式的值 ...
- NodeJS”热部署“代码,实现动态调试(hotnode,可以实现热更新)
NodeJS”热部署“代码,实现动态调试 开发中遇到的问题 如果你有 PHP 开发经验,会习惯在修改 PHP 脚本后直接刷新浏览器以观察结果,而你在开发 Node.js 实现的 HTTP 应用时会 ...
- [HDU1109]模拟退火算法
模拟退火的基本思想: (1) 初始化:初始温度T(充分大),初始解状态S(是算法迭代的起点),每个T值的迭代次数L (2) 对k=1,……,L做第(3)至第6步: (3) 产生新解$S\prime $ ...
- oracle 新增字段
alter table shop_procategory add (category_ORDER_FIELD number(10) default '0' not null);comment on c ...
- 在Visual Studio开发的项目中引用GAC中的dll
Open the windows Run dialog (Windows Key + r) Type C:\Windows\assembly\gac_msil. This is some sort o ...
- HDU 5241 Friends (大数)
题意:略. 析:答案就是32^n. 代码如下: import java.math.BigInteger; import java.util.Scanner; public class Main{ pu ...
- 高考是最后一次拼智商的事了。(beacuse 大多数人的努力程度之低根本轮不到拼天赋!)
高考是最后一次拼智商的事. —因为大多数人的努力程度之低 根本轮不到拼天赋 在这个不起眼的小公司实习也有两周了,周四经理说说为了增加IOS开发小组和安卓开发小组之间的交流,准备每周开一次这种报告会. ...
- sqlserver2012——游标
游标:一种数据访问机制,允许用户访问单独的数据行而不是对整个行集进行操作.用户可以通过单独处理每一行逐条收集信息并对数据逐行进行操作,这样可以将降低系统开销. 游标主要有以下两部分: 游标结果集:由定 ...
- 实现one hot encode独热编码的两种方法
实现one hot encode的两种方法: https://stackoverflow.com/questions/37292872/how-can-i-one-hot-encode-in-pyth ...