1
class A extends Thread {
    public void run() {
        for (int i = 1; i < 5; i++) {
            System.out.println("Thread A Loop NO " + i);

        }
        System.out.println("Exit from A");
    }
}

class B extends Thread {
    public void run() {
        for (int j = 1; j < 5; j++) {
            System.out.println("Thread B Loop no. " + j);
        }
        System.out.println("Exit from B");
    }
}

class C extends Thread {
    public void run() {
        for (int k = 1; k < 5; k++) {
            System.out.println("Thread C Loop no " + k);
        }
        System.out.println("Exit Form c");
    }
}

class Demo1 {
    public static void main(String args[]) {
        A a1 = new A();
        B b1 = new B();
        C c1 = new C();

        c1.setPriority(Thread.MAX_PRIORITY);
        a1.start();
        b1.start();
        c1.start();
    }
}  

私はこのプログラムを数回実行しました。最大優先度のスレッド「C」が最後に完了する場合があります。最大優先度では、最初に終了することが保証されませんか?つまり、他のスレッドがループを終了する前ですか?そうでない場合、スケジューラポリシーは何ですか?

4

3 に答える 3

3

最大優先度は、最初に終了することを保証しませんか????、つまり、他のスレッドがループから終了する前に????

いいえ、それは何も保証しません。

そうでない場合、スケジューラポリシーは何ですか???

あなたが特権ユーザーでない場合、espを自由に無視できるOSへのヒントです。

たとえそれがあなたが提案したことをしたとしても、それ自体の振る舞いに依存しすぎるのは悪い考えです。つまり、それがなくてもプログラムが正しく動作することを常に確認します。

スレッド C を最初に完了させたい場合は、最初にスレッド C を実行する必要があります。c1.run();

于 2012-10-02T11:12:13.990 に答える
0

提起された他のポイントとは別に、スレッドは出力ストリームのロックを取得して解放する以外は何もしません。CPUが1つしかないため、最優先の準備ができているスレッドしか実行できない場合でも、どのスレッドが最初に完了するかについて明確なことを言うことができるとは思えません。優先順位の変更は、過負荷のボックスのパフォーマンスのいくつかの側面を改善するための最適化です。これは絶対に同期メカニズムではなく、まったく機能しないアプリを機能するアプリに変えるために使用することはできません。言えることは、アプリが要件仕様のパフォーマンスしきい値を通過する可能性があるということです。

于 2012-10-02T12:35:36.803 に答える
0

Thread's優先度をに設定しMaxても、最後に終了することは保証されません。これは、このスレッドを他のスレッドよりも選択する必要があることを示すものとして使用されます。必要に応じて、CPUが空いている場合や、一部のスレッドを想定します。それを取得するのを待っています。したがって、この場合、を考慮するとPriority based Scheduling、最大の優先順位を持つスレッドが確実にCPUを取得します。

ただし、スレッドCが最後に終了することを確認したい場合は、このスレッドでThread.join()メソッドを呼び出して、他のスレッドをendスレッドCの後に強制することができます。joinスレッドには、他のスレッドから生成された他のスレッドにはspawned必要ないためです。)reference

于 2012-10-02T11:21:26.167 に答える