重定向到新URL时Applet崩溃

时间:2010-02-12 12:00:36

标签: java multithreading applet swingworker

我正在开发一个applet,它可以完成一些工作,然后在用户点击按钮时重定向到URL。我正在使用SwingWorker来防止GUI被锁定。

但是当我运行applet时,单击按钮后出现此错误:

  

线程中的异常“SwingWorker-pool-1-thread-2”java.lang.IllegalMonitorStateException   at java.util.concurrent.locks.ReentrantLock $ Sync.tryRelease(Unknown Source)   at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(Unknown Source)   at java.util.concurrent.locks.ReentrantLock.unlock(Unknown Source)   at java.util.concurrent.LinkedBlockingQueue.poll(Unknown Source)   at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)   at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)   在java.lang.Thread.run(未知来源)

看起来applet正在破坏自己,但工作线程仍然存在。如果我添加一个 Thread.sleep(2000); 作为测试,applet运行正确,但我认为这不是解决问题的正确方法。

我做错了什么?也许我应该从主线程进行重定向?也许applet的破坏方法应该等到工作线程完成?

Java源代码:

public class MyApplet extends javax.swing.JApplet {
    class MyWorker extends SwingWorker<Boolean , Void> {
        protected Boolean doInBackground() throws Exception {
  // DO THE HARD JOB...
        }

        public void done() {
  netscape.javascript.JSObject.getWindow(this).call("onDone", new String[] { "" });
        }
    }

    public void init() {
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {

                public void run() {
             initComponents();
                    setBackground(Color.WHITE);
                }
            });
        } catch (Exception ex) { 
  ex.printStackTrace();
 }
   }

   private void jMyButtonctionPerformed(java.awt.event.ActionEvent evt) {                                              
        new MyWorker().execute();        
    }                                             
}

HTML来源:

<script type="text/javascript">
function onDone(){document.location.href="http://myurl.com";}
</script>

1 个答案:

答案 0 :(得分:0)

最后使用SwingUtilities.invokeLater解决:D