Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么这个未来没有实现?_Scala - Fatal编程技术网

Scala 为什么这个未来没有实现?

Scala 为什么这个未来没有实现?,scala,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(nam

鉴于此代码:

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()
    }
}

为什么会这样?

因为您的程序已退出:

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)
  }

因为您的程序已退出:

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)
  }

您必须等待
将来的
完成。所以您的
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)
    }
}

您必须等待
将来的
完成。所以您的
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)
    }
}

Future和onComplete在独立的守护进程线程中执行。当主线程终止时(在最后一条指令之后),守护进程线程也会终止。在您的情况下,他们没有时间执行代码。使主代码长寿,例如,
Thread.sleep(100)
Future和onComplete在独立的守护进程线程中执行。当主线程终止时(在最后一条指令之后),守护进程线程也会终止。在您的情况下,他们没有时间执行代码。让你的主代码长寿,例如,
Thread.sleep(100)

,所以答案似乎就在这里。Scala的println不是System.out.println的别名,而是Console.println,它以不同的方式处理线程,因此答案似乎在于。Scala的println不是System.out.println的别名,而是Console.println,它以不同的方式处理线程

这是有道理的,但我仍然不明白为什么System.out.println可以工作而println不能工作?我测试了100次,每次System.out.println工作时,但println不工作。据我所知,println只是System.out.println的别名。我意识到线程是不确定的,但我不相信我的结果是一个简单的巧合,这是有意义的,但我仍然不明白为什么System.out.println起作用而println不起作用?我测试了100次,每次System.out.println工作时,但println不工作。据我所知,println只是System.out.println的别名。我意识到线程是不确定的,但我不相信我的结果是简单的巧合。我知道这已经有点晚了,但您能否在scala文档中提供“在分离的守护进程线程中执行未来和未完成”的参考?我找不到说明这一点的规范。我知道这有点晚了,但您能否在scala文档中提供对“Future and onComplete在分离的守护进程线程中执行”的参考?我无法找到说明这一点的规范。