Предположим, что у меня есть функция, которая вызывает блокирующую прерывистую операцию. Я хотел бы запустить его асинхронно с таймаутом. То есть, я хотел бы прервать функцию, когда время ожидания истекло.
Поэтому я пытаюсь сделать что-то вроде этого:
import scala.util.Try import scala.concurrent.Future def launch(f: () => Unit, timeout: Int): Future[Try[Unit]] = { val aref = new java.util.concurrent.atomic.AtomicReference[Thread]() import ExecutionContext.Implicits.global Future {Thread.sleep(timeout); aref.get().interrupt} // 1 Future {aref.set(Thread.currentThread); Try(f())} // 2 }
Проблема заключается в том, что aref
в (1) может быть нулевым, потому что (2) еще не установил его в текущий поток. В этом случае я хотел бы подождать, пока не будет установлен aref
. Каков наилучший способ сделать это?