23

割り込み可能なブロッキング操作を呼び出す関数があるとします。タイムアウトで非同期に実行したいと思います。つまり、タイムアウトになったら関数を中断したいと思います。

だから私はそのようなことをしようとしています:

import scala.util.Try
import scala.concurrent.Future

def launch(f: () => Unit, timeout: Int): Future[Try[Unit]] = {

  val aref = 新しい java.util.concurrent.atomic.AtomicReference[スレッド]()

  インポート ExecutionContext.Implicits.global
  未来 {Thread.sleep(timeout); aref.get().interrupt} // 1
  未来 {aref.set(Thread.currentThread); トライ(f())} // 2
}

問題は、aref(2) がまだ現在のスレッドに設定されていないため、(1) が null になる可能性があることです。この場合、設定されるまで待ちたいと思いarefます。それを行う最善の方法は何ですか?

4

5 に答える 5

16

Awaitを使用して、少し簡単なアプローチをとることもできます。このAwait.resultメソッドは、タイムアウト期間を 2 番目のパラメーターとして取り、TimeoutExceptionon タイムアウトをスローします。

try {
  import scala.concurrent.duration._
  Await.result(aref, 10 seconds);
} catch {
    case e: TimeoutException => // whatever you want to do.
}
于 2013-05-17T18:37:56.233 に答える