java - 当应用 Future 和 ThreadPools 进行多线程时,Scala Process 永远不会结束

标签 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 在_2 在_0 在_4 在_3 在_5 在_8 在_6 在_7 在_9 成功完成

我尝试在 main 方法末尾调用 System.exit(0) 但仍然没有用。有什么建议么?谢谢!

最佳答案

您需要在Await<之后通过pool.shutdown()关闭poolExecutorService/。由于 newFixedThreadPool 正在通过 defaultThreadFactory 创建非守护线程

这篇文章详细解释了守护进程线程和非守护进程线程:

What is Daemon thread in Java?

关于java - 当应用 Future 和 ThreadPools 进行多线程时,Scala Process 永远不会结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45009759/

相关文章:

java - 将项目添加到 ArrayList 并分隔

java - 如何组织由多个列表组成的模型

java - Android Looper 线程因 NullPointerException 而崩溃

generics - 参数化类型的特定生成器

java - Maven 无法使用 OpenJDK 11 找到 jaxb-api,即使它存在于存储库中

java - 尝试获取代码来检查是否有偶数括号

c# - Parallel.ForEach() 与 foreach(IEnumerable<T>.AsParallel())

java - 运行是线程的一种状态吗?

Scala 编译器优化以实现不变性

scala - 如何将流式数据写入S3?