2012-05-17 3 views
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), то также не запускаем в соответствии с приоритетом.ждать уведомит в Java

ответ

1

Это зависит от операционной системы, в которой работает программа. Немногие операционные системы не прислушиваются к приоритету, установленному приложением, или ведут себя неожиданно. Следовательно, не следует зависеть от приоритета.

Похожая нить найдено:

Thread priority and Thread accuracy

2

Tread.setPriority() изменяет приоритет выполнения нити, что означает, что более высокий приоритет поток имеет больше шансов на получение выбрали для выполнения при работе (по сравнению с одновременно работающий поток с более низким приоритетом). Конечно, если вы остановите поток с явным вызовом на wait(), он не будет работать во время ожидания, поэтому приоритет в этой ситуации не имеет смысла.

Обновление: как указано выше, приоритет работает нитей. При вызове notify() поток выбирается не на основе приоритета (по крайней мере, не гарантируется, спецификации не говорит, так или иначе)

+0

SIR ... КАК ВСЕ 3 РЕЗЬБЫ В ОЖИДАНИИ .... и после метода notifyall ... нить, у кого больше приоритета, будет работать первым или нет? –

+0

Не существует уверенности в том, какой поток будет выполняться первым, но в целом более высокие потоки приоритетов имеют более высокую вероятность того, что они будут выбраны для выполнения в любой момент времени. – Attila

+0

Правда, хотя он, вероятно, может реализовать свою собственную логику блокировки, чтобы иметь возможность уведомлять «хорошая» нить! –

1

Java Language Specification, 17.2.2 Notification:

«Там нет никакой гарантии, о которых поток в выбран режим ожидания. "

Обратите внимание на тщательно подобранную терминологию: ожидание комплект.