假设我有一个函数,它调用一个阻塞的可中断操作。我想在超时的情况下异步运行它。也就是说,我想在超时到期时中断功能。
所以我正在尝试这样做:
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 }
问题在于(1)中的aref
可以为空,因为(2)尚未将其设置为当前线程。在这种情况下,我想等待aref
被设置。执行此操作的最佳方式是什么?
如果添加CountDownLatch
,就可以实现您想要的行为。(请注意,在大量的Future
中阻塞(即被困在await
)可能会导致线程池耗尽。)
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]()
val cdl = new java.util.concurrent.CountDownLatch(1)
import ExecutionContext.Implicits.global
Future {Thread.sleep(timeout); cdl.await(); aref.get().interrupt} // 1
Future {aref.set(Thread.currentThread); cdl.countDown(); Try(f())} // 2
}
上一篇:将文件加载到RichTextBox中时,某些超链接不会触发LinkClicked事件中时、超链接、加载、事件
下一篇:调用std::Package_TASK::Get_Future()时可能出现争用情况可能出现、情况、std、Package_TASK