Я разрабатываю апплет, который выполняет некоторую работу, а затем перенаправляет на URL, когда пользователь нажимает кнопку. Я использую SwingWorker для предотвращения блокировки графического интерфейса.
Но когда я запускаю апплет, я получаю эту ошибку после нажатия кнопки:
Исключение в потоке "SwingWorker-pool-1-thread-2" java.lang.IllegalMonitorStateException
в java.util.concurrent.locks.ReentrantLock $ Sync.tryRelease (Неизвестный источник)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release (неизвестный источник)
в java.util.concurrent.locks.ReentrantLock.unlock (Неизвестный источник)
в java.util.concurrent.LinkedBlockingQueue.poll (Неизвестный источник)
в java.util.concurrent.ThreadPoolExecutor.getTask (Неизвестный источник)
в java.util.concurrent.ThreadPoolExecutor $ Worker.run (неизвестный источник)
at java.lang.Thread.run (неизвестный источник)
Похоже, что апплет самоуничтожается, но рабочий поток все еще жив. Если я добавлю Thread.sleep (2000); в качестве теста, апплет работает правильно, но я думаю, не правильный способ исправить это.
Что я делаю не так ?? Может мне сделать перенаправление из основного потока? Может, метод уничтожения апплета должен дождаться завершения рабочего потока?
Источник 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>