public class MyThreadDemo04 {
public static void main(String[] args) {
MyThread2 thread1 = new MyThread2("Thread-1");
MyThread2 thread2 = new MyThread2("Thread-2");
thread1.setPriority(10);
thread2.setPriority(1);
System.out.println(thread1.getName()+"------->"+thread1.getPriority());
System.out.println(thread2.getName()+"------->"+thread2.getPriority());
thread1.start();
thread2.start();
}
}
class MyThread2 extends Thread {
public MyThread2(String name) {
super(name);
}
@Override
public void run() {
for(int i=0;i<50;i++){
System.out.println(this.getName()+" "+i);
}
}
}
按照道理说thread1的优先级高,应该会优先执行thread1,thread1线程结束后,才会执行thread2线程。可是运行结果如下
Thread-1------->10
Thread-2------->1
Thread-1 0
Thread-2 0
Thread-1 1
Thread-2 1
Thread-1 2
Thread-2 2
Thread-2 3
Thread-1 3
Thread-2 4
Thread-1 4
Thread-2 5
Thread-1 5
Thread-2 6
Thread-1 6
Thread-2 7
Thread-1 7
Thread-2 8
Thread-2 9
Thread-2 10
Thread-2 11
Thread-2 12
Thread-2 13
Thread-2 14
Thread-1 8
Thread-2 15
Thread-1 9
Thread-2 16
Thread-1 10
Thread-2 17
Thread-1 11
Thread-2 18
Thread-1 12
Thread-2 19
Thread-1 13
Thread-2 20
Thread-1 14
Thread-2 21
Thread-1 15
Thread-2 22
Thread-1 16
Thread-2 23
Thread-1 17
Thread-2 24
Thread-1 18
Thread-2 25
Thread-1 19
Thread-2 26
Thread-1 20
Thread-2 27
Thread-1 21
Thread-2 28
Thread-1 22
Thread-2 29
Thread-1 23
Thread-2 30
Thread-1 24
Thread-2 31
Thread-1 25
Thread-1 26
Thread-1 27
Thread-1 28
Thread-1 29
Thread-1 30
Thread-1 31
Thread-1 32
Thread-1 33
Thread-1 34
Thread-1 35
Thread-1 36
Thread-1 37
Thread-1 38
Thread-1 39
Thread-1 40
Thread-2 32
Thread-1 41
Thread-2 33
Thread-1 42
Thread-2 34
Thread-1 43
Thread-2 35
Thread-1 44
Thread-2 36
Thread-1 45
Thread-1 46
Thread-2 37
Thread-1 47
Thread-2 38
Thread-1 48
Thread-2 39
Thread-1 49
Thread-2 40
Thread-2 41
Thread-2 42
Thread-2 43
Thread-2 44
Thread-2 45
Thread-2 46
Thread-2 47
Thread-2 48
Thread-2 49
不知道为什么会这样,看了Java从入门到精通,里面有这么句话,不知道原因是不是这个?
5 个解决方案
#1
楼主请记住一点,多线程的执行本身就是多个线程的交换执行,并非同时执行,执行的优先级只是他执行的概率。
例如原本优先级一样,那么两个线程的执行的概率都为50%。现在我们提高其中一个,那么一个为60%的概率抢到进入CPU执行的机会,另一个是依旧是40%。执行完一次之后又要重新抢占CPU。但是40%概率进入的线程也有可能抢到,虽然概率低了点,但总会有他执行的机会,万一次次都抽中40%的概率呢?所以你要正确理解线程和线程之间的优先级
例如原本优先级一样,那么两个线程的执行的概率都为50%。现在我们提高其中一个,那么一个为60%的概率抢到进入CPU执行的机会,另一个是依旧是40%。执行完一次之后又要重新抢占CPU。但是40%概率进入的线程也有可能抢到,虽然概率低了点,但总会有他执行的机会,万一次次都抽中40%的概率呢?所以你要正确理解线程和线程之间的优先级
#2
本来就没效果
#3
基本用处不大,写了这么多年程序,机会没有应用场景
#4
如果高优先级的是母亲,低优先级的是孩子,那个设置只是告诉虚拟机,出事了保母亲
#5
这个不是说 设置了优先级,,他就一定会先执行,,只是说在
资源紧缺的情况下,会优先考虑执行
#1
楼主请记住一点,多线程的执行本身就是多个线程的交换执行,并非同时执行,执行的优先级只是他执行的概率。
例如原本优先级一样,那么两个线程的执行的概率都为50%。现在我们提高其中一个,那么一个为60%的概率抢到进入CPU执行的机会,另一个是依旧是40%。执行完一次之后又要重新抢占CPU。但是40%概率进入的线程也有可能抢到,虽然概率低了点,但总会有他执行的机会,万一次次都抽中40%的概率呢?所以你要正确理解线程和线程之间的优先级
例如原本优先级一样,那么两个线程的执行的概率都为50%。现在我们提高其中一个,那么一个为60%的概率抢到进入CPU执行的机会,另一个是依旧是40%。执行完一次之后又要重新抢占CPU。但是40%概率进入的线程也有可能抢到,虽然概率低了点,但总会有他执行的机会,万一次次都抽中40%的概率呢?所以你要正确理解线程和线程之间的优先级
#2
本来就没效果
#3
基本用处不大,写了这么多年程序,机会没有应用场景
#4
如果高优先级的是母亲,低优先级的是孩子,那个设置只是告诉虚拟机,出事了保母亲
#5
这个不是说 设置了优先级,,他就一定会先执行,,只是说在
资源紧缺的情况下,会优先考虑执行