Scala - 多线程,当任何子线程完成时完成主线程

莱罗11

我正在构建一个方法,该方法采用 x 大小的方法序列并返回要完成的第一个方法的结果。

def invokeAny(work: Seq[() => Int]): Int = ???

如何通过使用线程来实现这一点?(不允许期货)

这是我能想到的最好的方法,但似乎并非在所有情况下都有效。

def invokeAny(work: Seq[() => Int]): Int = {
    @volatile var result = 0 // set to return value of any work function
    val main = Thread.currentThread()

    val threads: Seq[Thread] = work.map(work => new Thread( new Runnable { 
       def run { result = work(); main.interrupt();  }}))

    threads.foreach(_.start())
    for(thread <- threads) {
      try {
        thread.join()
      }  catch {
        // We've been interrupted: finish
        case e: InterruptedException => return result
    }
    }
    return result
  }
莱罗11

不是最漂亮的答案,但似乎有效:

def invokeAny(work: Seq[() => Int]): Int = {
    @volatile var result = 0 // set to return value of any work function
    val main = Thread.currentThread()

    var threads: Seq[Thread] = Seq()

    //Interrupts all threads after one is interrupted
    def interruptAll = {
      main.interrupt()
      for(thread <- threads) {
        thread.interrupt()

      }
    }

    threads = work.map(work => new Thread( 
        new Runnable { 
          def run {
            result = try {
              work() } catch {
                case e:InterruptedException => return
            }
            interruptAll;  

            }
          }))

    threads.foreach(_.start())
    for(thread <- threads) {
      try {
        thread.join()
      } catch {
        // We've been interrupted: finish
        case e: InterruptedException =>  return result
    }
    }
    return result
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scala-在多个线程中完成工作的最佳API

来自分类Dev

从Java多线程到Scala Akka actor

来自分类Dev

Java/Scala 多线程文件写入

来自分类Dev

主线程中的多线程矩阵乘法是否不等到其他线程完成其工作?

来自分类Dev

确保在主线程上执行完成块

来自分类Dev

如何在Haskell中强制主线程等待其所有子线程完成

来自分类Dev

具有多线程的Scala单例对象

来自分类Dev

如何在Akka和Scala中实现多线程?

来自分类Dev

用于Scala流生产和处理的多线程

来自分类Dev

等待主线程,直到其他线程未完成!

来自分类Dev

如何使主线程等待所有线程完成

来自分类Dev

当所有其他线程在主线程之前完成时,为什么仍然需要.join?

来自分类Dev

完成时返回的调用线程

来自分类Dev

WinApi C多线程:如何等待线程完成?

来自分类Dev

Java多线程:线程不会完成run()方法

来自分类Dev

多线程程序(CompletionService)中实时完成线程的实时输出

来自分类Dev

主线程卡在Python多线程中

来自分类Dev

可以从Scala的子线程中更改局部变量

来自分类Dev

如何等待任何工作线程的完成?

来自分类Dev

如何使主(调用)线程等待子线程完成执行?

来自分类Dev

在等待类尚未完成时保持主线程运行

来自分类Dev

在等待类尚未完成时保持主线程运行

来自分类Dev

主线程中调用AVAssetImageGenerator完成处理程序?

来自分类Dev

在主线程上运行NSURLSession完成处理程序

来自分类Dev

NSURLConnection sendAsynchronousRequest完成块是否在主线程上执行?

来自分类Dev

主线程完成后,正常关闭ExecutorService

来自分类Dev

主线程中调用AVAssetImageGenerator完成处理程序?

来自分类Dev

NSURLSession dataTaskWithRequest完成块是否始终在主线程上运行?

来自分类Dev

在主线程外完成工作以保持 UI 活动

Related 相关文章

  1. 1

    Scala-在多个线程中完成工作的最佳API

  2. 2

    从Java多线程到Scala Akka actor

  3. 3

    Java/Scala 多线程文件写入

  4. 4

    主线程中的多线程矩阵乘法是否不等到其他线程完成其工作?

  5. 5

    确保在主线程上执行完成块

  6. 6

    如何在Haskell中强制主线程等待其所有子线程完成

  7. 7

    具有多线程的Scala单例对象

  8. 8

    如何在Akka和Scala中实现多线程?

  9. 9

    用于Scala流生产和处理的多线程

  10. 10

    等待主线程,直到其他线程未完成!

  11. 11

    如何使主线程等待所有线程完成

  12. 12

    当所有其他线程在主线程之前完成时,为什么仍然需要.join?

  13. 13

    完成时返回的调用线程

  14. 14

    WinApi C多线程:如何等待线程完成?

  15. 15

    Java多线程:线程不会完成run()方法

  16. 16

    多线程程序(CompletionService)中实时完成线程的实时输出

  17. 17

    主线程卡在Python多线程中

  18. 18

    可以从Scala的子线程中更改局部变量

  19. 19

    如何等待任何工作线程的完成?

  20. 20

    如何使主(调用)线程等待子线程完成执行?

  21. 21

    在等待类尚未完成时保持主线程运行

  22. 22

    在等待类尚未完成时保持主线程运行

  23. 23

    主线程中调用AVAssetImageGenerator完成处理程序?

  24. 24

    在主线程上运行NSURLSession完成处理程序

  25. 25

    NSURLConnection sendAsynchronousRequest完成块是否在主线程上执行?

  26. 26

    主线程完成后,正常关闭ExecutorService

  27. 27

    主线程中调用AVAssetImageGenerator完成处理程序?

  28. 28

    NSURLSession dataTaskWithRequest完成块是否始终在主线程上运行?

  29. 29

    在主线程外完成工作以保持 UI 活动

热门标签

归档