7

この質問に対する多くの回答を見てきましたが、まだわかりません。

それらの1つは「Javaはプリエンプティブです」でした。(JVM は、プリエンプティブな優先度ベースのスケジューリング アルゴリズム (通常はラウンド ロビン アルゴリズム) を使用してスケジュールを設定します。

2 つ目は、同じ優先度の 2 つのスレッドが Java を実行すると、プリエンプトされず、1 つのスレッドが枯渇する可能性があることです。

だから今、私はそれをチェックするためのプログラムを書きました.10個の最小優先度のスレッドを作成し、次に最大優先度の10個のスレッドを作成しました。その結果、すべてのスレッド間でジャンプしました.優先順位

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

}
4

1 に答える 1

10

これが、2 つの引用のいずれかが示唆するほど正確に指定されているとは思えません。私が見つけのは次のとおりです。

すべてのスレッドには優先順位があります。優先度の高いスレッドは、優先度の低いスレッドよりも優先して実行されます。あるスレッドで実行されているコードが新しい Thread オブジェクトを作成すると、新しいスレッドの優先度は、最初は作成中のスレッドの優先度と同じに設定されます。

それを超えて、メカニズムはプラットフォームおよび JVM 固有のものであると私は信じています。私がよく知っているプラ​​ットフォームでは、JVM は OS スレッドを使用するため、OS スケジューラに依存しています。

とはいえ、デフォルトですべてのアプリケーション スレッドが同じ優先度を持っていることを考えると、これらのスレッドが互いにプリエンプトできないと非常に不便です。

于 2013-01-27T09:01:17.793 に答える