2015-07-01 93 views
0

我正在執行一些對時間敏感的操作,並且有一個與它們關聯的超時。檢測超時可調用實例

此超時機制是使用Java Callable類實現的。

問題是,在可調用實例中,我執行一個異步任務,並使用匿名接口實現(偵聽器)。

我的問題是,當超時觸發和callable被取消。異步回調仍然執行並破壞我的程序狀態。

如何防止這些回調發射?我是否只包含一個布爾值來指示是否發生超時或者是否有另一種實現此目的的方式?

謝謝。

碼參考:

Callable<Object> callableTransaction = new Callable<Object>() { 

    @Override 
    public Object call() throws Exception { 

     Callback callback = new Callback() { 

      // Do stuff here and change program state. 
     }; 

     performAsyncOperation(callback); 

     return ActionProcessor.OPERATION_COMPLETE; 
    } 
}; 

回答

1

你爲什麼不刪除performAsyncOperation並同步執行調用方法內的操作。

然後,如果您需要任何異步操作,則可以使用performAsyncOperation或executor服務來調用您的callableTransaction。

0

將您的Callable換成java.util.concurrent.FutureTask ...撥打task.cancel(true)當您想要取消的時候。如果您的Callable處於阻塞操作(例如,I/O),則將引發異常來標記中斷。否則,您的線程將需要定期使用Thread.isInterrupted()進行檢查,以確定它是否應該繼續或中止。

是的,這與包含您自己的boolean標誌大部分相同,但是您確實也可以獲得阻止操作被中斷的好處。

0

您有正確的想法:使用布爾標誌來跟蹤Callable是否被中斷。 (我假設,當你取消贖回,您指定它應該被打斷。)

使用併發類像CountDownLatch,使您的行爲贖回同步:

public Object call() throws Exception { 

    final AtomicBoolean aborted = new AtomicBoolean(); 
    final CountDownLatch latch = new CountDownLatch(1); 

    Callback callback = new Callback() { 

     if (aborted.get()) { 
      return; 
     } 

     // Do stuff here and change program state. 

     latch.countDown(); // Tell Callable we're done. 
    }; 

    performAsyncOperation(callback); 

    try { 
     latch.await();  // Wait for callback to finish. 
    } catch (InterruptedException e) { 
     aborted.set(true); 
    } 

    return ActionProcessor.OPERATION_COMPLETE; 
}