2013-06-05 35 views
0

我是否需要定期調用future.get來檢查任務是否被執行?如何查找線程何時完成?

ExecutorService executor = Executors.newSingleThreadExecutor(); 

@SuppressWarnings("unchecked") 
public void start(final file avo) throws IOException 
{ 
    Future future = executor.submit(new Callable(){ 

    @Override 
    public Object call() throws Exception { 
     Condee conv = new Condee(); 
     return conv.doChange(file); 
    }); 

    LOG.debug("Finished the execution serverion"); 
    executor.shutdown(); 


} 
+0

你需要更多地關注你的問題。像這樣一個模棱兩可的問題可能會被關閉或刪除。 – gparyani

回答

1

在executor.shutdown()之前添加對此的調用。

future.get(); 

該方法只有在完成時纔會返回。

+0

我評論joaonlima,因爲如果我們這樣做,操作不會異步執行。 – user1595858

+0

你能詳細說一下嗎?當你調用future.get時,調用future.get的線程將會阻塞,但未來啓動的線程將執行。你在找什麼行爲?你想知道誰在你的原始問題中完成線程? –

+0

我從主線程調用啓動方法。當我使用future.get時,主線程也被阻塞。我想啓動方法異步操作。這個創建的線程不應該通知任何人,它必須在完成時執行一個方法。 – user1595858

2

要檢查完成,您可以使用future.isDone(),這需要經常檢查。

但是,如果您使用future.get(),此方法將等待,直到完成,然後返回結果。

+0

我注意到,當我使用future.get()阻止觸發start方法而不是異步執行操作的主線程。我想異步執行啓動方法,你有什麼建議? – user1595858

+0

該操作異步發生,但主線程在調用get()時等待其完成以獲取值。如果你在主線程中有其他的東西(沒有這個返回值),你可以直接調用get()。 – joaonlima

0

嘗試檢索get get方法的值。您將得到結果或拋出異常。這裏有四種可能性,當你調用得到未來:

  1. 你得到的結果值
  2. 你得到CancellationException - 如果計算被取消 (如Future.cancel(TRUE)被調用)
  3. 你得到爲ExecutionException - 如果計算拋出異常
  4. 你得到InterruptedException - 如果當前線程被中斷 在等待(例如executor.shutdownNow()被調用)