2013-08-22 2 views
0

Я пытаюсь синхронизировать различные потоки в своем приложении. В основном есть некоторые потоки, которые должны иметь возможность заблокировать приложение от закрытия. Вот что у меня есть:Совместимость Java. Заблокировать приложение от выхода

public class Test{ 
    public static void main(String args[]){ 
    Syncer syncer = new Syncer(); 
    Object o = new Object(); 
    syncer.lockExit(o); 
    //.. do some stuff// 
    syncer.unlockExit(o); 
    } 
} 

public class Syncer { 

    private List<Object> l_Exit; 

    public Syncer() { 
     l_Exit = new ArrayList<Object>(); 
    } 

    public synchronized void lockExit(Object o) { 
     l_Exit.add(o); 
    } 

    public synchronized void unlockExit(Object o) { 
     l_Exit.remove(o); 
     if (l_Exit.isEmpty()) { 
      l_Exit.notifyAll(); 
     } 
    } 

    public synchronized void waitForExit() { 
     while (!l_Exit.isEmpty()) { 
      try { 
       l_Exit.wait(); 
      } catch (InterruptedException ex) { 
       Test.log.log(Level.SEVERE, null, ex); 
      } 
     } 
    } 
} 

Я получаю IllegalMonitorException при запуске syncer.unlockExit (о);

ответ

0
public synchronized void unlockExit(Object o) { 
    l_Exit.remove(o); 
    if (l_Exit.isEmpty()) { 
     l_Exit.notifyAll(); 
    } 
} 

Вы должны быть в синхронизированный блок для того, чтобы Object.wait(), Object.notify() или Object.notifyAll() для работы.

public synchronized void unlockExit(Object o) { 
    synchronized (lock) { 
     l_Exit.remove(o); 
     if (l_Exit.isEmpty()) { 
      l_Exit.notifyAll(); 
     } 
    } 
} 

Смотрите эту question для разъяснения того, почему.

+0

Хм после изменения метода waitForExit() я получил предупреждение от netbeans. Правильно ли этот код? public synchronized void waitForExit() { synchronized (l_Exit) { while (! L_Exit.isEmpty()) { try { l_Exit.wait(); } catch (InterruptedException ex) { CakeLauncher.log.log (Level.SEVERE, null, ex); } } } } – black

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