2012-07-24 60 views
0

所以我寫在斯卡拉迷你超時庫,它看起來非常相似,這裏的代碼:How do I get hold of exceptions thrown in a Scala Future?在Scala中,Futures.awaitAll會在超時時終止線程嗎?

我執行要麼會成功完成,或永遠阻塞的功能,所以我需要確保在超時執行線程被取消。

因此我的問題是:在超時時間內,awaitAll會終止潛在的actor,還是讓它永遠持續運行?

我正在考慮的一種替代方法是使用java Future庫來執行此操作,因爲可以調用顯式的cancel()方法。

+0

你是什麼意思「永遠阻止」–是阻止I/O?也許使用異步I/O。硬中斷Java線程不是推薦的事情。否則,如果該塊仍然是「接收」,那麼爲什麼不使用演員的方法,如在你連接的問題中給出的Viktor Klang的答案?然後你可以發送一封墮胎信息給那個演員。 – 2012-07-25 01:57:33

回答

0

[免責聲明 - 我是新來的斯卡拉演員] 當我看到它,scala.actors.Futures.awaitAll等待,直到期貨清單全部解決或直到超時。它不會Future.cancel,Thread.interrupt或以其他方式嘗試終止Future;你稍後再回來再等一會兒。

Future.cancel可能是合適的,但請注意,您的代碼可能需要參與影響cancel操作 - 它不一定是免費的。 Future.cancel取消預定但尚未開始的任務。它會中斷一個正在運行的線程[設置一個可以檢查的標誌] ...可能會或可能不會確認中斷。回顧Thread.interruptThread.isInterrupted()。您的長時間運行任務通常會檢查它是否被中斷(您的代碼)並自行終止。各種方法(即Thread.sleep,Object.wait等)通過投擲InterruptedException來響應中斷。您需要查看&瞭解該機制以確保您的代碼在這些限制內滿足您的需求。見this