取消摇摆工人的问题

时间:2012-01-30 15:44:18

标签: java concurrency swingworker

我在取消摇摆工人方面遇到了一些问题。在阅读文档后如何解决这个问题我不确定

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来解释这个问题(这是我读过的一种修复方法)

由于

2 个答案:

答案 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()自己检查并抛出异常。