黑马程序员技术交流社区
标题:
线程问题
[打印本页]
作者:
mzh901024
时间:
2013-8-3 19:08
标题:
线程问题
线程之间争夺CPU时间时,CPU 是怎么给予服务的,还有用ABORT()终止线程有什么不好的地方
作者:
sxdxgzr@126.com
时间:
2013-8-3 20:19
本帖最后由 sxdxgzr@126.com 于 2013-8-3 20:22 编辑
1.NET线程优先级:是指定一个线程的相对于其他线程的相对优先级,它规定了线程的执行顺序,对于在CLR中创建的线程,其优先级别默认为Normal,而在CLR之外创建的线程进入CLR时,将会保留其先前的优先级,可以通过访问线程的Priority属性来获取或设置线程的优先级别。System.Threading命名空间中的ThreadPriority枚举定义了一组线程优先级的所有可能值,我这里按级别由高到低排列出来,具体的说明就不在这里解释。 Highest , AboveNormal , Normal , BelowNormal , Lowest。
2线程调度:无论线程是否运行于CLR中,线程执行时间片是有操作系统进行分配的,线程是严格按照其优先级来调度执行的,调度算法来确定线程的执行顺序,不同的操作系统可能又不同的调度算法。具有最高优先级别的线程经过调度后总是首先运行,只要具有较高优先级别的线程可以运行,较低级别的所有线程就必须等待。如果具有相同优先级的多个线程都可以运行,那么调度程序将遍历处于该优先级的所有线程,并为每个线程提供一个固定的执行时间片,因此同一优先级的线程很多时候都是交替执行的。如果具有较高优先级的线程可以运行,较低优先级的线程将被抢先,并允许具有较高优先级的线程再次执行,如果在给定的优先级上不再有可运行的线程,则调度程序将转移到下一个低级别的优先级,并在该优先级上调度线程。
3如:
using System;
using System.Threading;
namespace Thread2
{
class Test
{
public static void Main()
{
//线程threadA 优先级默认为nomal
var threadA = new Thread(delegate()
{
for (int i = 0; i < 20; i++)
{
Console.Write("A");
}
});
//线程B 优先级为Highest
var threadB = new Thread(delegate()
{ //线程threadB
for (int i = 0; i < 20; i++)
{
Console.Write("B");
}
}){Priority = ThreadPriority.Highest};
//线程threadC 优先级为BelowNormal
var threadC = new Thread(delegate()
{
for (int i = 0; i < 20; i++)
{
Console.Write("C");
}
}) {Priority = ThreadPriority.BelowNormal};
//线程threadD 优先级为AboveNormal
var threadD = new Thread(delegate()
{
for (int i = 0; i < 20; i++)
{
Console.Write("D");
}
}) {Priority = ThreadPriority.AboveNormal};
//启动线程
threadB.Start();
threadD.Start();
threadA.Start();
threadC.Start();
Console.ReadKey();
}
}
}
复制代码
由于设置线程调度优先级threadB>threadD>threadA>threadC,且线程按优先级启动时的执行结果:线程优先级高的先执行完,优先级低的后执行完。可以运行代码试试。
4
作者:
zhangcheng5468
时间:
2013-8-3 20:44
关于CPU等系统资源的分配是操作系统的问题啦,操作系统对于CPU的分配有很多相关的复杂算法,建议你学习一下操作系统课程!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2