线程优先级问题?

时间:2022-03-16 05:27:30

public class Priorty {

static class MyThread extends Thread{
private int ID=0;
public MyThread(int id){
this.ID=id;
}
public void run(){
System.out.println("MyThread-"+this.ID+" begin! Priorty: "+this.getPriority());
System.out.println("MyThread-"+this.ID+" end");
}
}
public static void main(String []args){
MyThread[] myThreads=new MyThread[3];
for(int i=0;i<3;i++){
myThreads[i]=new MyThread(i+1);
myThreads[i].setPriority(i*3+1);
}
for(int i=0;i<3;i++){
myThreads[i].start();
}
}
}



启动3个线程,分别将优先级设为1,4,7.目的是先调用按优先级的高低输出,但是虚拟机的输出结果是随机的,请问用什么方法,能按规定优先级的高低调用?

//运行结果:
MyThread-2 begin! Priorty: 4
MyThread-3 begin! Priorty: 7
MyThread-1 begin! Priorty: 1
MyThread-2 end
MyThread-3 end
MyThread-1 end
//--------------
MyThread-1 begin! Priorty: 1
MyThread-2 begin! Priorty: 4
MyThread-1 end
MyThread-3 begin! Priorty: 7
MyThread-3 end
MyThread-2 end
//--------------
MyThread-1 begin! Priorty: 1
MyThread-1 end
MyThread-3 begin! Priorty: 7
MyThread-3 end
MyThread-2 begin! Priorty: 4
MyThread-2 end
//--------------
MyThread-3 begin! Priorty: 7
MyThread-3 end
MyThread-2 begin! Priorty: 4
MyThread-2 end
MyThread-1 begin! Priorty: 1
MyThread-1 end




13 个解决方案

#1


在这段代码加一句话如何:

for(int i=0;i<3;i++){
            myThreads[i].start();
            Tread.sleep(10);
        }

每次启动一个线程后,当前线程休眠10毫秒,以确保它已经开始。

#2


如果你去把操作系统原理那本书看一下,或许对你有点帮助。

#3


引用 2 楼 bingdian7451321 的回复:
如果你去把操作系统原理那本书看一下,或许对你有点帮助。


如果你是给我个建议我谢谢你,但是如果在对方有疑问的时候用这种方式回答你觉得合适吗?
最起码要尊重发帖人,来CSDN的都是为了学习,碰到问题了,向大伙请教一下,一起解决,或许也是你不会或者是你没遇到的问题。
如果你要是把所有计算机的书都看完并且精通了那你来CSDN有什么意义?难道就是为了让别人看你打那几个破字?
-----------------------做人厚道些好!!!
                                               以上个人观点,仅对此人回答强烈不满!

#4


引用 1 楼 qusic 的回复:
在这段代码加一句话如何: 

Java code
for(int i=0;i<3;i++){
            myThreads[i].start();
             Tread.sleep(10);
        }



每次启动一个线程后,当前线程休眠10毫秒,以确保它已经开始。

可能没问清楚

目的是为了测试优先级,用不sleep方法是为了证明多个同时启动的线程,大多数情况下优先级高的先运行,完全取决于java虚拟机的调度。

#5


OS只是保证了优先级高的线程会被优先执行..但是不是一定先执行.
在JVM的调度算法中也是如此.

#6


优先级只能保证在同一时抢占的线程,优先级高的先占用,
只是这段代码运行太快了,根本就不是同一时刻的,前一个线程早运行完了~
加了Thread.sleep()也没用

#7


不懂,求解!

#8


不同平台下,线程调度算法不一样

#9


引用 6 楼 hotapple 的回复:
优先级只能保证在同一时抢占的线程,优先级高的先占用,
只是这段代码运行太快了,根本就不是同一时刻的,前一个线程早运行完了~
加了Thread.sleep()也没用

ding

#10


这个就像生男生女,无法控制一样。

#11


MyThread-3 begin! Priorty: 7
MyThread-3 end
MyThread-2 begin! Priorty: 4
MyThread-2 end
MyThread-1 begin! Priorty: 1
MyThread-1 end


我的CP上每次运行都是这个..........

#12


5楼讲的是对的,优先级只针对争抢资源的情况。要不然有个优先级是最高的 他什么都不干,
后面的一直等待,这样不好吧。11楼估计是cpu太差了

#13


引用 3 楼 ThirdDimension 的回复:
引用 2 楼 bingdian7451321 的回复:
如果你去把操作系统原理那本书看一下,或许对你有点帮助。


如果你是给我个建议我谢谢你,但是如果在对方有疑问的时候用这种方式回答你觉得合适吗?
最起码要尊重发帖人,来CSDN的都是为了学习,碰到问题了,向大伙请教一下,一起解决,或许也是你不会或者是你没遇到的问题。
如果你要是把所有计算机的书都看完并且精通了那你来CSDN有什么意义?难道就是为了让别人看你打那几个破字?



我只是给你一个建议,如果你要把多线程这一块搞好,而且工作之后能让别人愿意相信你的实力,愿意让你写这一块的代码。那么就按我说的做。你可能还没有工作或者还没有碰到这样的事情,不过以后你会碰到的。如果技术不能用到产品上,学技术还有什么用。再次重复一遍,只是建议,做不做是你自己的事情。我很少给别人回帖,因为出力不讨好的事情有点气人。

#1


在这段代码加一句话如何:

for(int i=0;i<3;i++){
            myThreads[i].start();
            Tread.sleep(10);
        }

每次启动一个线程后,当前线程休眠10毫秒,以确保它已经开始。

#2


如果你去把操作系统原理那本书看一下,或许对你有点帮助。

#3


引用 2 楼 bingdian7451321 的回复:
如果你去把操作系统原理那本书看一下,或许对你有点帮助。


如果你是给我个建议我谢谢你,但是如果在对方有疑问的时候用这种方式回答你觉得合适吗?
最起码要尊重发帖人,来CSDN的都是为了学习,碰到问题了,向大伙请教一下,一起解决,或许也是你不会或者是你没遇到的问题。
如果你要是把所有计算机的书都看完并且精通了那你来CSDN有什么意义?难道就是为了让别人看你打那几个破字?
-----------------------做人厚道些好!!!
                                               以上个人观点,仅对此人回答强烈不满!

#4


引用 1 楼 qusic 的回复:
在这段代码加一句话如何: 

Java code
for(int i=0;i<3;i++){
            myThreads[i].start();
             Tread.sleep(10);
        }



每次启动一个线程后,当前线程休眠10毫秒,以确保它已经开始。

可能没问清楚

目的是为了测试优先级,用不sleep方法是为了证明多个同时启动的线程,大多数情况下优先级高的先运行,完全取决于java虚拟机的调度。

#5


OS只是保证了优先级高的线程会被优先执行..但是不是一定先执行.
在JVM的调度算法中也是如此.

#6


优先级只能保证在同一时抢占的线程,优先级高的先占用,
只是这段代码运行太快了,根本就不是同一时刻的,前一个线程早运行完了~
加了Thread.sleep()也没用

#7


不懂,求解!

#8


不同平台下,线程调度算法不一样

#9


引用 6 楼 hotapple 的回复:
优先级只能保证在同一时抢占的线程,优先级高的先占用,
只是这段代码运行太快了,根本就不是同一时刻的,前一个线程早运行完了~
加了Thread.sleep()也没用

ding

#10


这个就像生男生女,无法控制一样。

#11


MyThread-3 begin! Priorty: 7
MyThread-3 end
MyThread-2 begin! Priorty: 4
MyThread-2 end
MyThread-1 begin! Priorty: 1
MyThread-1 end


我的CP上每次运行都是这个..........

#12


5楼讲的是对的,优先级只针对争抢资源的情况。要不然有个优先级是最高的 他什么都不干,
后面的一直等待,这样不好吧。11楼估计是cpu太差了

#13


引用 3 楼 ThirdDimension 的回复:
引用 2 楼 bingdian7451321 的回复:
如果你去把操作系统原理那本书看一下,或许对你有点帮助。


如果你是给我个建议我谢谢你,但是如果在对方有疑问的时候用这种方式回答你觉得合适吗?
最起码要尊重发帖人,来CSDN的都是为了学习,碰到问题了,向大伙请教一下,一起解决,或许也是你不会或者是你没遇到的问题。
如果你要是把所有计算机的书都看完并且精通了那你来CSDN有什么意义?难道就是为了让别人看你打那几个破字?



我只是给你一个建议,如果你要把多线程这一块搞好,而且工作之后能让别人愿意相信你的实力,愿意让你写这一块的代码。那么就按我说的做。你可能还没有工作或者还没有碰到这样的事情,不过以后你会碰到的。如果技术不能用到产品上,学技术还有什么用。再次重复一遍,只是建议,做不做是你自己的事情。我很少给别人回帖,因为出力不讨好的事情有点气人。