我在取消摇摆工人方面遇到了一些问题。在阅读文档后如何解决这个问题我不确定
sw = new SwingWorker<Object, Void>()
{
Object o;
protected Object doInBackground() throws Exception
{
//do some long running task via a method call
}
}
然后在我的取消按钮处理程序中,我只想调用sw.cancel(true);
这似乎不起作用。根据文档,摇摆工作者不需要如何取消它。但是,如果运行swing工作者的方法只是calld一次,那么我如何用thread.sleep来解释这个问题(这是我读过的一种修复方法)
由于
答案 0 :(得分:2)
Swing实际上会用Future来监控你的工作。当您尝试取消工作程序时,Swing将调用future.cancel(true)
(真值将尝试interrupt()
执行的线程)。
这意味着您的工作需要应对中断。如果长时间运行的计算没有响应中断,则必须放入一些检查点并做出相应的响应
protected Object doInBackground() throws Exception
{
//do part 1 of long running task
if(Thread.currentThread().isInterrupted()){
//clean up and return
}
//do part 2 of long running task
if(Thread.currentThread().isInterrupted()){
//clean up and return
}
//etc..
}
Swing只会通知执行线程它应该取消。实际执行取消是您的责任。
答案 1 :(得分:1)
这里有一篇非常好的文章:http://blogs.oracle.com/swinger/entry/swingworker_stop_that_train
简而言之,调用cancel()
会设置线程的'中断'标志。如果您正在进行I / O操作或调用Thread.sleep()
,那么将检查该标志并且将抛出InterruptedException
。如果你不做这些事情,你可以使用Thread.currentThread().isInterrupted()
自己检查并抛出异常。