2013-06-21 68 views
0

我有一個SwingWorker在後臺運行。它在 工作後的一些東西。它會等待。當用戶按下按鈕時,將調用MyListener將 並喚醒工作人員繼續做一些事情。它不像我想的那樣工作 。它在底部引發異常。請告訴我 我做錯了什麼。如何喚醒等待的SwingWorker?

MyWorker worker = new MyWorker();  

class MyListener implements ActionListener { 

    @Override 
    public void actionPerformed (ActionEvent e) { 

     //DO some stuff and wake up worker 
     worker.notify();   
    } 
} 

class MyWorker extends SwingWorker { 

    boolean _work = true; 

    @Override 
    protected Object doInBackground() throws Exception { 
     System.out.println ("in myWorker"); 
     while (_work == true) { 

      //DO some stuff here 
      wait();   
     } 
     return null; 
    } 
} 

例外:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException 
    at java.lang.Object.notify(Native Method) 
    at worker.Worker$2.actionPerformed(Worker.java:54) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2713) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) 
    at java.awt.EventQueue.access$000(EventQueue.java:101) 
    at java.awt.EventQueue$3.run(EventQueue.java:666) 
    at java.awt.EventQueue$3.run(EventQueue.java:664) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:680) 
    at java.awt.EventQueue$4.run(EventQueue.java:678) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:677) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 

回答

2

您需要添加圍繞notify調用一個synchronized塊。

synchronized (worker) { 
    worker.notify(); 
} 

現在,說了這麼多,你通常使用的實例變量作爲監測鎖,而是使用一個static final鎖定對象(除其他事項外)鼓勵它降低了錯誤的實例

+0

感謝的潛力您。這同步確定了例外。由於某種原因,工人仍然沒有醒來。我還錯過了什麼嗎? – tadpole

+0

在工作人員做同樣的事情(除了呼叫等待),我敢打賭,這項工作已經拋出了同樣的例外情況,但由於工作人員的工作方式,您還沒有看到它 – MadProgrammer

+0

你是對的。再次感謝。 – tadpole