2012-01-30 68 views
2

我在取消揮杆工時遇到了一些問題。我閱讀文檔後,不能確定如何對待我的取消按鈕的處理程序解決此取消揮杆工的問題

sw = new SwingWorker<Object, Void>() 
{  
    Object o; 
    protected Object doInBackground() throws Exception  
    {   
    //do some long running task via a method call 
    } 
} 

然後,我只是想打電話給sw.cancel(true);

這似乎不被工作雖然。根據文件,擺動員工不需要如何取消它。但是,如果運行擺動工人的方法只被calld一次,然後我如何解釋這種用了Thread.Sleep(這是我讀過的是固定的單程)

感謝

+0

長時間運行的任務是做什麼的?它需要能夠通過輪詢線程中斷狀態或使用非阻塞I/O來檢測並響應線程中斷。 – lhballoti 2012-01-30 15:55:10

+0

只是一系列的方法調用使用反射調用另一個項目 – Biscuit128 2012-01-30 15:56:35

回答

1

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.. 
} 

搖擺只會通知正在執行的線程,它應該取消。實際執行取消是你的責任。

+0

所以這些檢查coyuld實際上進入方法調用內部擺動工人調用,因爲他們將由揮杆工作人員運行? – Biscuit128 2012-01-30 16:18:38

+0

@Ricki這是完全正確的。 doInBackground是在swing工作者已知的單獨線程上完成的,所以當Swing調用取消方法Thread.currentThread()。isInterrupted()應該返回true。 – 2012-01-30 16:23:59

+0

很好的解決它,非常感謝。 – Biscuit128 2012-01-30 16:43:23

1

有這裏有一篇不錯的文章:http://blogs.oracle.com/swinger/entry/swingworker_stop_that_train

簡而言之,調用cancel()會設置線程的「中斷」標誌。如果您正在執行I/O操作或調用Thread.sleep()那麼該標誌將被檢查,並且InterruptedException將被拋出。如果你沒有做這些事情,你可以使用Thread.currentThread().isInterrupted()自己檢查並拋出異常。