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