为什么这个未来没有被执行?

时间:2015-07-31 04:46:27

标签: scala

鉴于此代码:

object Test {

    import scala.concurrent.ExecutionContext.Implicits.global

    def main(args: Array[String]): Unit = {
        val f: Future[String] = Future { "Test" }
        f.onComplete {
            case Success(name) => println(name)
            case Failure(t) => t.printStackTrace()
        }
    }
}

我看不到输出,但是将println更改为System.out.println有效:

object Test {

    import scala.concurrent.ExecutionContext.Implicits.global

    def main(args: Array[String]): Unit = {
        val f: Future[String] = Future { "Test" }
        f.onComplete {
            case Success(name) => System.out.println(name)
            case Failure(t) => t.printStackTrace()
        }
    }
}

同样使用带有标准线程的println也可以:

object Test {

    def main(args: Array[String]): Unit = {
        val t = new Thread() {
            override def run(): Unit = println("Test")
        }
        t.start()
        t.join()
    }
}

为什么会这样?

4 个答案:

答案 0 :(得分:4)

您必须等待Future完成。因此,您的System.out.println版本也可能输出。

object Test {

    import scala.concurrent.ExecutionContext.Implicits.global

    def main(args: Array[String]): Unit = {
        val f: Future[String] = Future { "Test" }
        f.onComplete {
            case Success(name) => println(name)
            case Failure(t) => t.printStackTrace()
        }
        Await.result(f)
    }
}

答案 1 :(得分:3)

Future和onComplete在分离的守护程序线程中执行。当主线程终止时(在最后一条指令之后),守护程序线程也会终止。在您的情况下,他们没有时间执行代码。让您的主要代码保持较长时间,例如Thread.sleep(100)

答案 2 :(得分:0)

因为你的程序退出了:

def main(args: Array[String]): Unit = {
    val f: Future[String] = Future { "Test" }
    f.onComplete {
      case Success(name) => println(name)
      case Failure(t) => t.printStackTrace()
    }
    Thread.sleep(100)
  }

答案 3 :(得分:0)

所以答案似乎在于this answer。 Scala的println不是System.out.println的别名,而是以不同方式处理线程的Console.println