关于java线程优先级的问题

阮文明 发布于 2012/11/04 12:56
阅读 577
收藏 1
public class BB {
public static void main(String[] args) 
{
Thread t1 = new Thread(new T1());
Thread t2 = new Thread(new T2());
t1.setPriority(Thread.NORM_PRIORITY + 5);  //考虑把本语句注释掉后会怎样
t1.start();
t2.start();
}
}


class T1 implements Runnable {
public void run() {
for(int i=0; i<100; i++) {
System.out.println("T1: " + i);
}
}
}


class T2 implements Runnable {
public void run() {
for(int i=0; i<100; i++) {
System.out.println("------T2: " + i);
}
}

}
为什么这段代码不是先执行完T1再执行T2  我已经设置了T1的优先级更高啊
加载中
0
小菜的粉丝
小菜的粉丝
java的线程优先级不是很可靠吧,要根据操作系统吧。
阮文明
阮文明
o了
0
陶邦仁
陶邦仁

这个问题,楼主得首先弄明白CPU在运行时会划分为N个时间片段,线程只能在CPU为自己分配的时间片段中执行,当时间片段过了之后,就该轮到下一个线程的时间片段了,所以下一个线程就开始执行。举个例子,CPU会划分出N个时间片段time1、time2。。。,当CPU进入time1时间片段时,会在等待池中根据线程优先级,选择线程执行,time1时间片段已过,执行的线程会再次进入准备状态,但此时未回到等待池中,在CPU进入time2的时间片段时,那么就会在等待池的剩余线程中,根据优先级选择下一个执行线程,依次循环,类推。以上所述,大概楼主应该明白优先级是做嘛用的了吧,为什么不是先执行完优先级高的T1再执行T2了吧,而是它们是交替执行。不过在输出日志中可以看出,T1的输出大部分都在T2的前面。。。

0
阮文明
阮文明

引用来自“爪哇老妖”的答案

这个问题,楼主得首先弄明白CPU在运行时会划分为N个时间片段,线程只能在CPU为自己分配的时间片段中执行,当时间片段过了之后,就该轮到下一个线程的时间片段了,所以下一个线程就开始执行。举个例子,CPU会划分出N个时间片段time1、time2。。。,当CPU进入time1时间片段时,会在等待池中根据线程优先级,选择线程执行,time1时间片段已过,执行的线程会再次进入准备状态,但此时未回到等待池中,在CPU进入time2的时间片段时,那么就会在等待池的剩余线程中,根据优先级选择下一个执行线程,依次循环,类推。以上所述,大概楼主应该明白优先级是做嘛用的了吧,为什么不是先执行完优先级高的T1再执行T2了吧,而是它们是交替执行。不过在输出日志中可以看出,T1的输出大部分都在T2的前面。。。

谢谢 很详细
0
Ryan-瑞恩
Ryan-瑞恩
《操作系统》知识了,,,,你该看看了。
0
loki_lan
loki_lan
JAVA基础有待提高。
返回顶部
顶部