1
class Callme {
    void call(String msg) {
        System.out.print("[" + msg);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println("Interrupted");
        }
        System.out.println("]");    
    }
}    

class Caller implements Runnable {
    String msg;
    Callme target;
    Thread t;
    public Caller(Callme targ, String s) {
        target = targ;
        msg = s;
        t = new Thread(this);
        t.start();
    }

    public void run() {
        //synchronized(target){ // synchronized block
        target.call(msg);
        //}
    }
}
class Synch {
    public static void main(String args[]) {
        Callme target = new Callme();
        Caller ob1 = new Caller(target, "Hello");
        ob1.t.setPriority(Thread.NORM_PRIORITY);
        Caller ob2 = new Caller(target, "Synchronized");
        Caller ob3 = new Caller(target, "World");
        ob2.t.setPriority(Thread.MAX_PRIORITY);
        ob3.t.setPriority(Thread.MIN_PRIORITY);
        System.out.println(ob1.t.getPriority());
        System.out.println(ob2.t.getPriority());
        System.out.println(ob3.t.getPriority());
        // wait for threads to end
        try {
            ob1.t.wait();
            ob2.t.wait();
            ob3.t.wait();
            ob1.t.notifyAll();

        } catch(InterruptedException e) {
            System.out.println("Interrupted");
        }
    }
}

子スレッドを優先しwait()notifyall()メソッドが使用されるため、優先度に従って実行する必要があります。でも走らない。も使用する場合synchronized(target)、優先度に従って実行されません。

4

3 に答える 3

3

は、スレッドのTread.setPriority()実行優先度を変更します。つまり、優先度の高いスレッドは、実行時に選択される可能性が高くなります (優先度の低いスレッドを同時に実行する場合と比較して)。もちろん、明示的に を呼び出してスレッドを停止wait()させてしまうと、待機中は実行されないので、そのような状況では優先度は意味がありません。

更新:上記のように、スレッドの実行が優先されます。選択したスレッドを呼び出すときはnotify()、優先順位に基づいていません (少なくとも保証されているわけではありません。仕様では、何らかの方法で指定されているわけではありません)。

于 2012-05-17T10:03:41.483 に答える
1

Java言語仕様、17.2.2通知:

「待機セット内のどのスレッドが選択されるかについての保証はありません。」

慎重に選択された用語に注意してください:待機セット

于 2012-05-17T10:05:24.800 に答える
1

これは、プログラムが実行されているオペレーティング システムによって異なります。アプリケーションによって設定された優先度に注意を払わないオペレーティング システムや、予期しない動作をするオペレーティング システムはほとんどありません。したがって、優先順位に依存するべきではありません。

同様のスレッドが見つかりました:

スレッドの優先度とスレッドの精度

于 2012-05-17T09:55:38.817 に答える