加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

未来与Scala的超时

发布时间:2020-12-16 09:21:47 所属栏目:安全 来源:网络整理
导读:假设我有一个函数,它调用一个阻塞中断操作.我想以超时的方式异步运行它.也就是说,当超时到期时,我想中断该功能. 所以我试图做这样的事情: import scala.util.Tryimport scala.concurrent.Futuredef launch(f: () = Unit,timeout: Int): Future[Try[Unit]] =
假设我有一个函数,它调用一个阻塞中断操作.我想以超时的方式异步运行它.也就是说,当超时到期时,我想中断该功能.

所以我试图做这样的事情:

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可以为null,因为(2)尚未将其设置为当前线程.在这种情况下,我想等到isf设置.最好的方法是什么?

解决方法

如果您添加了CountDownLatch,您可以实现所需的行为. (请注意,在许多期货中阻止(即卡住等待)可能导致线程池的饥饿.)

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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读