【发布时间】:2014-10-10 07:00:43
【问题描述】:
我创建了一个有 3 个按钮的 gui;连接、断开、中止。它们都共享一个共同的 SwingWorker 线程,但由于某种原因,除非我点击中止按钮,否则该线程永远不会结束。
我还没有为断开按钮编写任何代码,但即便如此,它与我的问题无关。但是,为什么线程不完成并打印Done 语句?我的猜测是它陷入了this.isCancelled() 循环,但即使我这样做:
while(!this.isCancelled() || !this.isDone()) { // run loop }
它从不打印Done
线程只有在我点击中止按钮后才结束。我正在使用isCancelled() 循环方法,因为这似乎是取消 SwingWorker 的推荐方法。
我只发布下面的相关代码,因为实际上有数百行。
private class ButtonListener implements ActionListener {
private MyWorker worker;
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(connectButton)) {
worker = new MyWorker(activityTextArea);
worker.execute();
activityTextArea.append("Connect Button Pressed");
}
if(e.getSource().equals(disconnectButton)) {
activityTextArea.append("Disconnect Button Pressed");
}
if(e.getSource().equals(abortButton)) {
worker.cancel(true);
activityTextArea.append("Abort Button Pressed");
}
}
}
这是 SwingWorker:
public class MyWorker extends SwingWorker<Void, Void> {
private JTextArea textArea;
MyWorker(JTextArea textArea) {
this.textArea = textArea;
}
private void startWorker() {
ProcessBuilder pb = new ProcessBuilder();
pb.command("aCmd");
Process p;
try {
p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while((line = br.readLine()) != null) {
textArea.append(line + "\n");
}
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected Void doInBackground() throws Exception {
// TODO Auto-generated method stub
boolean isFirstTime = true;
while(!this.isCancelled()) {
if(this.isDone()) { break; }
Thread.sleep(3000);
if(isFirstTime) {
startWorker();
isFirstTime = false;
}
}
return null;
}
@Override
protected void done() {
textArea.append("Done\n");
}
}
【问题讨论】:
标签: java multithreading user-interface swingworker