我正在使用Swingworker从url地址请求值来动态更改显示信息的版本。在某些情况下,该工人被取消。问题是我有时会得到java.lang.InterruptedException(但不是每次我取消worker)。我不知道该怎么做,而且我不知道它在哪里抛出,我无法调试它因为我在短时间内做了很多版本更改时得到它(我使用滑块,当我拖动它时会发生这种情况一段时间)。一切正常但我得到了这个恼人的错误:
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at sun.plugin2.message.Queue.waitForMessage(Unknown Source)
at sun.plugin2.message.Pipe$2.run(Unknown Source)
at com.sun.deploy.util.Waiter$1.wait(Unknown Source)
at com.sun.deploy.util.Waiter.runAndWait(Unknown Source)
at sun.plugin2.message.Pipe.receive(Unknown Source)
at sun.plugin2.main.client.MessagePassingExecutionContext.doCookieOp(Unknown Source)
at sun.plugin2.main.client.MessagePassingExecutionContext.getCookie(Unknown Source)
at sun.plugin2.main.client.PluginCookieSelector.getCookieFromBrowser(Unknown Source)
at com.sun.deploy.net.cookie.DeployCookieSelector.getCookieInfo(Unknown Source)
at com.sun.deploy.net.cookie.DeployCookieSelector.get(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.setCookieHeader(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.writeRequests(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at org.dbwiki.web.applet.ValueRequester.doInBackground(ValueRequester.java:40)
at org.dbwiki.web.applet.ValueRequester.doInBackground(ValueRequester.java:1)
at javax.swing.SwingWorker$1.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javax.swing.SwingWorker.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
在上面显示的每个异常之后,还会抛出另外的消息:
sun.plugin2.main.client.PluginMain: unrecognized message ID 46
有趣的是,当程序在浏览器中作为applet运行时,只会抛出异常,如果程序从api作为applet运行,则不会抛出任何异常。
我的StringWorker:
package org.dbwiki.web.applet;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import javax.swing.SwingWorker;
public class ValueRequester extends SwingWorker<Void, Void> {
HtmlGenerator htmlGen;
ArrayList<String[]> versionsData;
String id;
private String dbName;
ValueRequester (HtmlGenerator htmlGen, ArrayList<String[]> versionData, int ver){
try {
this.htmlGen=htmlGen;
if (TreeVisualiser.typeParameter.equals(TreeVisualiser.StructureVisualiserParameter))
this.id=htmlGen.getElem().getVersionElementId(ver);
else if(TreeVisualiser.typeParameter.equals(TreeVisualiser.HistoryVisualiserParameter))
this.id=htmlGen.getElem().getId();
this.dbName=htmlGen.getElem().getDBName();
this.versionsData=versionData;
} catch (Exception e) {
e.printStackTrace();
}
}
protected Void doInBackground() throws Exception {
try{
String value="";
URL historyURL = new URL("http://127.0.0.1:8080/"+dbName+id+"?value");
URLConnection hc = historyURL.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(hc.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
value+=line;
}
in.close();
this.htmlGen.formDisplayerHead();
this.htmlGen.formNodeDataHtml(value,this.versionsData);
this.htmlGen.formDisplayerTail();
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
protected void done()
{
if (!this.isCancelled())
this.htmlGen.dataDisplayer.setText(this.htmlGen.getHtml());
}
}
我现在已经知道是什么导致它,如何处理它或至少如何隐藏它(因为一切正常)。任何帮助将不胜感激。
更新
我尝试在ValueRequester.doInBackround()中捕获此异常,但是我的catch语句没有捕获异常。我更新的doInBackground()代码:
protected Void doInBackground() throws Exception {
try{
String value="";
URL historyURL = new URL("http://127.0.0.1:8080/"+dbName+id+"?value");
URLConnection hc = historyURL.openConnection();
InputStream inputStrm=hc.getInputStream();
InputStreamReader inputStrmRdr= new InputStreamReader(inputStrm);
this.in = new BufferedReader(inputStrmRdr);
String line;
while ((line = in.readLine()) != null) {
value+=line;
}
this.htmlGen.formDisplayerHead();
this.htmlGen.formNodeDataHtml(value,this.versionsData);
this.htmlGen.formDisplayerTail();
}catch (InterruptedException e){
System.out.println("Interrupted Exception caught!");
// e.printStackTrace();
}
return null;
}
不幸的是仍然打印堆栈跟踪而不是系统输出消息。知道这里有什么不对吗?
答案 0 :(得分:2)
对我来说,看起来你正在调用worker.cancel(true);
(假设worker是你的SwingWorker)。 true
表示如果当前Thread处于可中断状态,则可以中断Thread。发生这种情况时,它会自动抛出一个Exception,指示Thread已被中断,允许您释放资源并可能执行某些操作。我想在你的情况下,你可以放心地忽略这一点,只需关闭打开的流。
在您的情况下,根据您在“工作”中的距离,任务可能会中断或不中断。
查看有关Thread interruption here的更多信息。
答案 1 :(得分:2)
据我所知,只有当某个其他线程在被阻塞的线程上调用InterruptedException
时才会出现Thread.interrupt()
。在这种情况下,很明显中断的线程当时处于wait()
调用中。
查看SwingWorker代码,如果调度的线程决定在其上调用cancel(true)
,则工作线程似乎将获得中断。根据工作线程当时的工作情况,它可能会得到InterruptedException
,或者可能只设置了Thread.interrupted
标记。
因此,问题的解决方案似乎是找出cancel(true)
实例上调用SwingWorker
的内容。然后将其更改为不执行此操作...或使您的工人类适当地处理InterruptedException
。适当的行为可能是捕获异常并从call(...)