我在使用我的摇摆器线程时遇到了一些麻烦,问题在于我取消时。基本上,我有一个开始按钮,点击时可以运行我的挥杆工。摇摆工恢复问题
从这里我的挥杆工作人员做了一些小事情,但最主要的是它完成了一些长时间运行的反射调用。
我也有一个取消按钮 - 你可能猜到取消了我的挥杆。然而,问题是我有一个我无法查明的错误。
在通过第一次运行中途取消应用程序之后,摆动工人完全取消,但是,如果我然后再次单击开始,并在完成时让它一直运行 - 线程似乎从哪里回来了我第一次运行取消:/。我不知道为什么会这样,它就像取消的线程正在恢复并实际记住状态一样。我知道这是因为在我的GUI上,我有一个JLabel,它说“处理15的元素1”,然后它跳回到取消点。
public class Test
{
private SwingWorker<Object, Integer> swingworker = initiate();
private void startListener()
{
start.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
runIt();
}
});
}
private void runIt()
{
try
{
if(swingworker .isDone())
swingworker = getSwingWorker();
swingworker.execute();
}
catch (HeadlessException e) { }
catch(Exception e){LogFileWriter.log(e);}
}
private SwingWorker<Object, Integer> getSwingWorker()
{
return new SwingWorker<Object, Integer>()
{
Object o;
protected Object doInBackground() throws Exception
{
//do some short calcs
doLongCalc();
return o;
}
protected void done()
{
if(!swingworker .isCancelled()) {} //chnage the gui values like enable/disable button }
else{}//it was cancelled so stop progress bar and stuff
}
};
}
private void cancelListener()
{
cancel.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(swingworker.getState() == SwingWorker.StateValue.STARTED || swingworker.getState() == SwingWorker.StateValue.DONE)
{
swingworker .cancel(true);
}
}
});
}
private void doLongCalc()
{
//wrap the taks in checks for cancelled or not
if(!swingworker.isCancelled())//do something
if(!swingworker.isCancelled())//do something
if(!swingworker.isCancelled())//do something
if(!swingworker.isCancelled())//do something
}
}
逻辑看起来很腥(在runit中f.i.状态检查不完整,或者在工作人员完成后查询外部类中定义的字段而不是这个) - 这可能导致在两个不同的实例上作用 – kleopatra 2012-03-13 14:35:27