admin管理员组文章数量:1624332
一 概述
-
在C#中线程的优先级使用线程的Priority属性设置即可,默认的优先级是Normal,在设置优先级后,优先级 高的线程将优先执行
-
优先级的值通过ThreadPriority枚举类型来设置,从低到高分别为Lowest、BelowNormal、Normal、AboveNormal、Highest
<!--more-->
二 实例
2.1 实例一 通过设置线程的优先级来控制输出奇数和偶数的线程,为了看出设置线程优先级的效果将输出 1〜100 中的奇数和 0〜100 中的偶数
2.1.1 代码
<span style="color:#333333">class Program
{
static void Main(string[] args)
{
ThreadStart ts1 = new ThreadStart(PrintEven);
Thread t1 = new Thread(ts1);
//设置打印偶数线程的优先级
t1.Priority = ThreadPriority.Lowest;
ThreadStart ts2 = new ThreadStart(PrintOdd);
Thread t2 = new Thread(ts2);
//设置打印奇数线程的优先级
t2.Priority = ThreadPriority.Highest;
t1.Start();
t2.Start();
}
//打印1~100中的奇数
public static void PrintOdd()
{
for(int i = 1; i <= 100; i = i + 2)
{
Console.WriteLine(i);
}
}
//打印0~100中的偶数
public static void PrintEven()
{
for(int i = 0; i <= 100; i = i + 2)
{
Console.WriteLine(i);
}
}
}</span>
2.1.2 效果图
2.1.3 说明
-
从上面的运行效果可以看出,由于输出奇数的线程的优先级高于输出偶数的线程,所以在输出结果中优先输出期数的次数会更多
-
此外,每次输出的结果也不是固定的。通过优先级是不能控制线程中的先后执行顺序的,只能是优先级高的线程执行的次数多而已
-
线程状态控制的方法包括暂停线程(Sleep)、中断线程(Interrupt)、挂起线程(Suspend)、唤醒形成(Resume)、终止线程(Abort)
2.2 实例二 使用暂停线程 (Sleep) 的方法让打印奇数和打印偶数的线程交替执行,即打印 0〜10 的数
2.2.1 代码
<span style="color:#333333">class Program
{
static void Main(string[] args)
{
ThreadStart ts1 = new ThreadStart(PrintOdd);
Thread t1 = new Thread(ts1);
ThreadStart ts2 = new ThreadStart(PrintEven);
Thread t2 = new Thread(ts2);
t1.Start();
t2.Start();
}
//打印1~100中的奇数
public static void PrintOdd()
{
for(int i = 1; i <= 10; i = i + 2)
{
//让线程休眠 1 秒
Thread.Sleep(1000);
Console.WriteLine(i);
}
}
//打印0~100中的偶数
public static void PrintEven()
{
for(int i = 0; i <= 10; i = i + 2)
{
Console.WriteLine(i);
//让线程休眠 1 秒
Thread.Sleep(1000);
}
}
}</span>
2.2.2 效果
2.2.3 说明
-
从上面的运行效果可以看出,通过Sleep方法能控制两个线程执行的先后顺序
-
需要注意的是,两个线程虽然交替执行,但每次运行该程序的效果依然是不同的
2.3 实例三 模拟发放 10 个红包,当剩余 5 个红包时线程终止
2.3.1 代码
<span style="color:#333333">class Program
{
private static int count = 10;
private static void GiveRedEnvelop()
{
while (count > 0)
{
count--;
if(count == 4)
{
//终止当前线程
Console.WriteLine("红包暂停发放!");
Thread.CurrentThread.Abort();
}
Console.WriteLine("剩余 {0} 个红包", count);
}
}
static void Main(string[] args)
{
ThreadStart ts = new ThreadStart(GiveRedEnvelop);
Thread t = new Thread(ts);
t.Start();
}
}</span>
2.3.2 效果
2.3.3 说明
-
目前,由于挂起线程(Suspend)和唤醒线程(Resume)的操作很容易造成线程的死锁状态,已经被弃用了,而是使用标识符字段来设置线程挂起和唤醒的状态
-
所谓线程死锁就是多个线程之间处于相互等待的状态
-
线程分为前台线程和后台线程,前台线程不用等主程序结束,后台线程则需要应用程序运行结束后才能结束
-
此外,在应用程序运行结束后,后台线程即使没有运行完也会结束,前台线程必须等待自身线程运行结束后才会结束
-
使用Thread对象的IsBackground属性来判断线程是否为后台线程
2.4 实例四 在上一实例的基础上判断发红包的线程是否为后台线程,如果不是后台线程,将其设置为后台线程
2.4.1 代码
<span style="color:#333333">class Program
{
private static int count = 10;
private static void GiveRedEnvelop()
{
while (count > 0)
{
count--;
if (count == 4)
{
//终止当前线程
Console.WriteLine("红包暂停发放!");
Thread.CurrentThread.Abort();
}
Console.WriteLine("剩余{0}个红包",count);
}
}
static void Main(string[] args)
{
ThreadStart ts = new ThreadStart(GiveRedEnvelop);
Thread t = new Thread(ts);
t.Start();
if (t.IsBackground == false)
{
Console.WriteLine("该线程不是后台线程!");
t.IsBackground = true;
}
else
{
Console.WriteLine("该线程是后台线程!");
}
}
}</span>
2.4.2 说明
运行该程序,直接输出“该线程不是后台线程!”,由于将该线程设置为后台线程,则不会输出红包发放的信息
本文标签: Priority
版权声明:本文标题:C#开发之——Priority(14.5) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1728894553a1178248.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论