【问题标题】:Is Java preemptive?Java是抢占式的吗?
【发布时间】:2013-01-27 08:54:34
【问题描述】:

我已经看到了很多关于这个问题的答案,但我仍然不确定。

其中之一是“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();
        }

    }
}

t

/*
 * 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);
        }
    }

}

【问题讨论】:

    标签: java multithreading thread-priority preemptive


    【解决方案1】:

    我认为这并不像两个引号中的任何一个所暗示的那样精确。我能找到的所有was:

    每个线程都有一个优先级。具有较高优先级的线程优先于具有较低优先级的线程执行。当在某个线程中运行的代码创建一个新的 Thread 对象时,新线程的优先级最初设置为等于创建线程的优先级。

    除此之外,我相信这些机制是特定于平台和 JVM 的。在我熟悉的平台上,JVM 使用 OS 线程,因此依赖于 OS 调度程序。

    也就是说,默认情况下,所有应用程序线程都具有相同的优先级,如果这些线程不能相互抢占,那将非常不方便。

    【讨论】:

    • 所以,总结一下:如果我的操作系统不支持线程调度,那么所有相同的优先级线程都会饿死,因为 JVM 没有做任何事情。谢谢
    • 如果你的操作系统不支持线程调度,那么你就没有一个为这个操作系统提供本地线程的虚拟机,虚拟机必须实现自己的线程调度。你认为什么操作系统没有线程?
    • 是的,您的问题是正确的,也许可以更改我的问题中的 if 假设.. 但不要介意“... JVM 使用操作系统线程,因此依赖于操作系统调度程序”回答了我.因为 JVM 依赖于抢占式操作系统调度程序,所以我看到了令人困惑的输出。
    • @JBNizet,HP NonStop 的 JRE 是一种不使用本机线程的实现。 HP nonStop 根本没有线程,因此 JRE 尝试使用本机进程实现线程调度。请参阅 java 手册中的多线程部分。所以是的,线程调度取决于 JRE 如何实现它。h10032.www1.hp.com/ctg/Manual/c02132394
    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 2011-11-23
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多