2013-07-04 5 views
1

привет, ребята, это мой код, проблема заключается в том, что, несмотря на вызов notifyAll, он не освобождает блокировку, можете ли вы изложить причину и рассказать о решении. Я новичок в потоках. Заранее спасибо.освободить замок от объекта в java

class Lock1 {} 

class Home1 implements Runnable { 
private static int i = 0; 

private Lock1 object; 
private Thread th; 

public Home1(Lock1 ob, String t) { 

    object = ob; 
    th = new Thread(this); 
    th.start(); 
} 

public void run() { 
    synchronized (object) { 

     while (i != 10) { 
      ++i; 
      System.out.println(i); 
     } 
     try { 
      // System.out.println("here"); 
      object.wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

     } 
     System.out.println("here thread 1"); 
    } 
} 
} 

class Home2 implements Runnable { 
private static int i = 0; 

private Lock1 object; 
Thread th; 

public Home2(Lock1 ob, String t) { 

    object = ob; 
    th = new Thread(this); 
    th.start(); 
} 

public void run() { 
    synchronized (object) { 

     while (i != 10) { 
      ++i; 
      System.out.println(i); 
     } 
     try { 
      // System.out.println("here"); 
      object.wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

     } 
     System.out.println("here thread 2"); 

    } 
} 

    } 

public class Locking { 

public static void main(String arg[]) { 
    Lock1 ob = new Lock1(); 

    new Home1(ob, "thread 1"); 
    new Home2(ob, "thread 2"); 
    synchronized (ob) { 
     ob.notifyAll(); 
    } 
} 

} 
+1

Привет - не могли бы вы дать более подробное объяснение того, чего вы пытаетесь достичь с помощью своего кода? – robjohncox

+1

Я не понимаю, почему у вас есть дубликаты классов «Home1» и «Home2»? и чего именно вы пытаетесь достичь? – Multithreader

+0

Я просто играю с потоками и пытаюсь освободить все блокировки и завершить выполнение программы. Здесь выполнение не завершено. –

ответ

6

Когда вы используете уведомление, вы также должны изменить состояние, и когда вы используете wait, вы должны проверить это изменение состояния.

В вашем случае вероятно, что notifyAll будет вызван задолго до того, как потоки действительно успеют начать. (Для компьютера начало потока занимает целую вечность, например, 10 000 000 тактов). Это означает, что notifyAll теряется. (Он только уведомляет темы, которые фактически ждут в этот момент)

+0

Еще один отличный ответ; +1, аксиоматически. – Bathsheba

+1

сэр любой способ завершить выполнение? должен ли я поместить некоторый 'sleep()' в основной поток до вызова уведомления? –

+0

да, это сработало! совершенно правильный объяснение. –

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

  • Нет связанных вопросов^_^