Java是先发制人的吗?
我已经看到了这个问题的许多答案,但我仍然不确定 其中之一是“Java是先发制人的”。 (JVM使用抢占式、基于优先级的调度算法(通常是循环算法)进行调度 第二个问题是,如果两个具有相同优先级的线程运行,Java将不会抢占,一个线程可能会饿死 所以现在我写了一个程序来检查它,我创建了10个具有最低优先级的线程 然后是具有最大优先级的10个线程, 结果是我在所有线程之间跳转——这意味着Java是抢占式的 即使两个线程具有相同的优先级Java是先发制人的吗?,java,multithreading,thread-priority,preemptive,Java,Multithreading,Thread Priority,Preemptive,我已经看到了这个问题的许多答案,但我仍然不确定 其中之一是“Java是先发制人的”。 (JVM使用抢占式、基于优先级的调度算法(通常是循环算法)进行调度 第二个问题是,如果两个具有相同优先级的线程运行,Java将不会抢占,一个线程可能会饿死 所以现在我写了一个程序来检查它,我创建了10个具有最低优先级的线程 然后是具有最大优先级的10个线程, 结果是我在所有线程之间跳转——这意味着Java是抢占式的 即使两个线程具有相同的优先级 /* * To change this template, c
/*
* 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();
}
}
}
我认为这并不像两个引语中的任何一个所暗示的那样精确。我所能找到的是: 每个线程都有一个优先级。优先级较高的线程优先于优先级较低的线程执行。当在某些线程中运行的代码创建新线程对象时,新线程的优先级最初设置为与创建线程的优先级相等 除此之外,我相信机制是特定于平台和JVM的。在我熟悉的平台上,JVM使用OS线程,因此依赖于OS调度器
也就是说,由于默认情况下所有应用程序线程都具有相同的优先级,如果这些线程不能抢占彼此的位置,那将非常不方便。因此,作为结论:如果我的操作系统不支持线程调度,那么所有相同优先级的线程都将饿死,因为JVM什么都没有做。谢谢你的操作系统不支持线程调度,此操作系统的虚拟机将不具有本机线程,虚拟机将必须实现其自己的线程调度。您在考虑哪些没有线程的操作系统?是的,您的问题是对的,可能会在“假设”中更改我问题中的“如果”。但不要介意“…JVM使用OS线程,因此依赖于OS调度程序"回答我。因为JVM依赖于抢占式的OS调度程序,所以我看到了一个令人困惑的输出。@JBNizet,HP NonStop的JRE是一个不使用本机线程的实现。HP NonStop根本没有线程,因此JRE尝试使用本机进程实现线程调度。请参阅多线程se是的,线程调度取决于JRE如何实现它。
/*
* 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);
}
}
}