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

这取决于程序运行的操作系统。很少有操作系统不注意应用程序设置的优先级——或者表现出意外。因此,不应依赖于优先级。

找到了类似的线程:

螺纹优先级和螺纹精度

于 2012-05-17T09:55:38.817 回答
1

Java 语言规范,17.2.2 通知:

“无法保证选择等待集中的哪个线程。”

请注意精心挑选的术语:a wait set

于 2012-05-17T10:05:24.800 回答