Scala:从Runnable返回

时间:2018-05-16 14:25:35

标签: scala parallel-processing runnable

我正在学习Scala。我正在阅读Scala计划:

class MyProg() extends StrictLogging with Runnable {
  private val scheduledFuture = new AtomicReference[ScheduledFuture[_]]
  def start() = {
    scheduledFuture.set(executor.scheduleWithFixedDelay(this, initialDelaySeconds, intervalSeconds, TimeUnit.SECONDS))
  }

  def stop() = {
    Option(scheduledFuture.get()).map(_.cancel(true))
  }

  override def run() = try {
    process()
  } catch {
    case e: Exception => logger.warn("Error", e)
  }

  def process() :Unit {
    // do something
    if (condition) return // Line 203
    // do something else
  }
}

启动Runnable的另一段代码:

Option(myProg).map(_.start)

我的问题:

1,从Runnable内部返回是对的吗? process()计划每intervalSeconds秒运行一次。即使有时process()从内部返回,它仍然会被称为intervalSeconds秒之后。我是对的吗?

2,我们可以在这里使用System.exit(0)throw new Exception("...")吗?调用System.exit(0)throw new Exception("...")后,process()将再次被称为

顺便说一下,为什么def process() :Unit {}?我们可以使用def process() :Unit = {}

吗?

欢迎任何评论。感谢

1 个答案:

答案 0 :(得分:0)

  1. return来自process函数,它不是最常用的惯用法,但它可以很好地完成它,有时它可以提高性能/可读性。 scheduleWithFixedDelay延迟是在一次执行终止和下一次执行开始之间。
  2. System.exit(0)将终止jvm,因此之后不会运行任何内容。 抛出异常取决于:如果在process函数内抛出异常,它将重新运行。调度程序实际上运行run函数,该函数捕获从process抛出的所有异常。
  3. def process() :Unit {}已弃用,不应使用。总是使用 def process() :Unit = {}方式。
  4. 这段代码似乎是从java转换而来的,我不认为学习scala是一个很好的起点。 无论如何,最好的学习方法就是尝试。花些时间与它“玩”一点。