我已经看到很多这个问题的答案,但我仍然不确定。
其中一个是“Java是先发制人”。 (JVM使用抢占式,基于优先级的调度算法(通常是循环算法)进行调度。
第二个问题是,如果具有相同优先级的2个线程运行Java将不会抢占,并且一个线程可能会饿死。
所以现在我写了一个程序来检查它,我创建了10个具有最低优先级的线程 接着是10个具有最高优先级的线程, 结果是我在所有线程之间跳转 - 这意味着Java是先发制人的 即使2个线程具有相同的优先级
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication1;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @
*/
public class JavaApplication1 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
for (int i=0;i<10;i++){
Thread t=new Thread(new Dog(i));
t.setPriority(Thread.MIN_PRIORITY);
t.start();
}
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
Logger.getLogger(JavaApplication1.class.getName()).log(Level.SEVERE, null, ex);
}
for (int i = 0; i < 10; i++) {
Thread g = new Thread(new Dog(i+10));
g.setPriority(Thread.MAX_PRIORITY);
g.start();
}
}
}
吨
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication1;
/**
*
* @author Matan2t
*/
public class Dog implements Runnable{
public int _x=-1;
public Dog(int x){
_x=x;
}
@Override
public void run(){
while(true){
System.out.println("My Priority Is : " + _x);
}
}
}
答案 0 :(得分:10)
我不认为这是指定的,因为两个引号中的任何一个都会提示。我只能找到was:
每个帖子都有优先权。具有较高优先级的线程优先于具有较低优先级的线程执行。当在某个线程中运行的代码创建一个新的Thread对象时,新线程的优先级最初设置为等于创建线程的优先级。
除此之外,我相信这些机制是特定于平台和JVM的。在我熟悉的平台上,JVM使用OS线程,因此依赖于OS调度程序。
也就是说,鉴于默认情况下所有应用程序线程都具有相同的优先级,如果这些线程无法相互抢占,那将非常不方便。