割り込み可能なブロッキング操作を呼び出す関数があるとします。タイムアウトで非同期に実行したいと思います。つまり、タイムアウトになったら関数を中断したいと思います。
だから私はそのようなことをしようとしています:
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ます。それを行う最善の方法は何ですか?