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"); 
     } 
    } 
} 

에 통보 기다립니다. 하지만 도망 가지 마라. synchronized(target)도 사용하면 우선 순위에 따라 실행되지 않습니다.우리가 자식 스레드에 우선 순위를 부여하고 <code>wait()</code> 및 <code>notifyall()</code> 방법이 그렇게 사용 우선 순위에 따라 실행해야하는 반면 자바

답변

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:

(이 보장되지 적어도 사양이 어떤 식 으로든 말을하지 않습니다) 우선 순위에 따라되지 않는다 "보장이없는에있는 스레드에 대한 대기 세트가 선택됩니다. "

주의해서 선택한 용어를 유의하십시오. 대기 을 설정하십시오.