2014-02-12 3 views
0

Я написал три программы голодание, но ни один из них не бросает исключение, как:Простая программа Голодание, которая бросает исключение

"Thread-2" prio=1 tid=0x080db6c8 nid=0x22de waiting for monitor entry [0xa81e4000..0xa81e4150] 
     at yourClass.run(yourcCass.java:55) 
     - waiting to lock <0xa89fc7f0> (a java.lang.Object) 
     - locked <0xa89fcdb0> (a starvation) 
     at java.lang.Thread.run(Thread.java:595) 

"Thread-1" prio=1 tid=0x080da780 nid=0x22dd waiting for monitor entry [0xa8264000..0xa82650d0] 
     at yourClass.run(yourClass.java:55) 
     - waiting to lock <0xa89fc7f0> (a java.lang.Object) 
     - locked <0xa89fcc48> (a starvation) 
     at java.lang.Thread.run(Thread.java:595) 

"Thread-0" prio=1 tid=0x080d9100 nid=0x22db in Object.wait() [0xa8366000..0xa8366fd0] 
     at java.lang.Object.wait(Native Method) 
     - waiting on <0xa89fc978> (a starvation) 
     at starvation.run(yourClass.java:62) 
     - locked <0xa89fc7f0> (a java.lang.Object) 
     - locked <0xa89fc978> (a starvation) 
     at java.lang.Thread.run(Thread.java:595) 

, который показывает, что ваша программа в голодании.

Может кто-нибудь помочь с простой программой голодания, которая выдает выше исключения.

С помощью при условии, что код, который я написал это:

public class ThreadStarvation implements Runnable{ 

boolean t1Entered = false; 

public synchronized void synchronizedTimerMethod(){ 
    System.out.println(Thread.currentThread().getName()+" enters synchronized block"); 
    while (!t1Entered && !Thread.currentThread().getName().equals("t1")) { 
     try { 
      wait(); 

     } catch (Exception e) { 

     } 
    } 

    t1Entered = true; 

    while (true) { 
     try{ 
      Thread.sleep(5000); 
      } 
      catch (InterruptedException ie) {} 
     System.out.println(Thread.currentThread().getName()+" in synchronized block"); 

    } 
} 

public void run(){ 
    synchronizedTimerMethod(); 
} 

public static void main(String[] args) { 
    ThreadStarvation ts1=new ThreadStarvation(); 

    Thread t1=new Thread(ts1); 
    t1.setName("t1"); 

    Thread t2=new Thread(ts1); 
    t2.setName("t2"); 

    t2.start(); 

    try{ 
    Thread.sleep(2000); 
    } 
    catch (InterruptedException ie) {} 

    t1.start(); 

    try{ 
     Thread.sleep(16000); 
     } 
     catch (InterruptedException ie) {} 
    System.out.println(t1.getState()); 
    System.out.println(t2.getState()); 

    } 
} 

t2 будет голодной, то почему сообщение не дается JVM, что t2 в голодании или в ожидании входа монитора? Я разрешил свою программу работать в течение 20 минут.

+0

Можете ли вы опубликовать фактический код? –

+0

SO помогает тем, кто помогает себе ... что у вас есть до сих пор? – dcsohl

+0

какое исключение вы ожидаете? Почему, по вашему мнению, голод относится к исключению? –

ответ

0

jvm не создает исключение для самого голода. Поток будет следить за монитором.

Вы можете использовать lock.trylocak и выдавать исключение, если поток не может получить блокировку после нескольких попыток.

+0

** lock.trylocak ** что это? можете ли вы кратко объяснить? – Nizam

+0

простить мою орфографическую ошибку, ее lock.tryLock, вот пример того же http://robaustin.wikidot.com/reentrantlock. Идеально, что вы можете указать тайм-аут, для которого вы будете пытаться блокировать и что-то делать иначе, если вы не получите блокировку. –

Смежные вопросы