将Future和ThreadPools应用于多线程时,Scala Process永远不会结束

时间:2017-07-10 10:31:43

标签: java multithreading scala

以下是代码段:

object Test {
  def main(args: Array[String]): Unit = {
    // MARK: parallelization
    val pool = Executors.newFixedThreadPool(3)
    implicit val xc = ExecutionContext.fromExecutorService(pool)
    var taskQueue = new ArrayBuffer[Future[Unit]]()

    for (i <- 0 until 10)  {
      try {
        taskQueue += Future {
          print(s"in_${i}\n")
          Thread.sleep(1000)
        }
      } catch {
        case t: Throwable =>  {
          print(t)
        }
      }
    }

    val importTasks = Future.sequence(taskQueue)
    importTasks.onSuccess { case res => print("finishOnSuccess") }
    Await.result(importTasks, Duration.Inf)
  }
}

在使用以下输出执行所有作业后,它将永久挂起:

IN_1   IN_2   in_0   in_4   in_3   in_5   in_8   in_6   in_7   in_9   finishOnSuccess

我尝试在System.exit(0)方法结束时调用main但仍无用。有什么建议?谢谢!

1 个答案:

答案 0 :(得分:2)

ExecutorService之后pool pool.shutdown() Await newFixedThreadPool {}}由于{{1}}正在defaultThreadFactory创建非守护程序线程

并且本帖详细解释了守护程序主题和非守护程序主题:

What is Daemon thread in Java?