8

スレッドを生成し、そのスレッドでコードを実行したいと考えています。Scala のオプションは何ですか?

使用例は次のようになります。

Thread.currentThread setName "MyThread"

val myThreadExecutor = ???

val threadNamePromise = Promise[String]

future {
  myThreadExecutor run {
    val threadName = "MySpecialThread"
    Thread.currentThread setName threadName
    threadNamePromise success threadName
  }
}

Await.result(threadNamePromise.future, Duration.Inf)

future {
  myThreadExecutor run {
    println(Thread.currentThread.getName) // MySpecialThread
  }
}

future {
  myThreadExecutor run {
    println(Thread.currentThread.getName) // MySpecialThread
  }
}

println(Thread.currentThread.getName)   // MyThread

組み込みの Scala ライブラリに使用できるものはありますか?

編集

意図をより反映するようにスニペットを更新しました

4

4 に答える 4

7

はいあります。scala.concurrent標準ライブラリの を使用できます。より具体的には、高度に構成可能な非同期計算であるフューチャーを使用できます。

import java.util.concurrent.Executors
import concurrent.{ExecutionContext, Await, Future}
import concurrent.duration._

object Main extends App {

  // single threaded execution context
  implicit val context = ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor())

  val f = Future {
    println("Running asynchronously on another thread")
  }

  f.onComplete { _ =>
    println("Running when the future completes")
  }

  Await.ready(f, 5.seconds) // block synchronously for this future to complete

}

Future は、スレッド プールの抽象化である実行コンテキストで実行されます。このコンテキストは暗黙的に渡すことができます。上記の例では、Scala ライブラリによって定義されたグローバルなものを使用しましたが、多くの実行コンテキストを割り当てることで、プログラムのこの側面を制御できます。

スニペットは、あなたが要求したこと、つまりコードを同時に実行することだけを行います。ただし、フューチャーはそれ以上のものです。値を非同期に計算したり、複数のフューチャーを構成して、それらの間の依存関係を持つ結果を取得したり、並列に実行したりできます。

ここに紹介があります: http://docs.scala-lang.org/overviews/core/futures.html

于 2013-04-02T20:50:32.020 に答える
3

@alexwriteshereの回答を基礎として使用して、この実装を作成しました。

import java.util.concurrent.Executors
import scala.concurrent.future
import scala.concurrent.JavaConversions.asExecutionContext

class ApplicationThread {
  protected implicit val context = 
    asExecutionContext(Executors.newSingleThreadExecutor())

  def run(code: => Unit) = future(code)
}

アップデート

これが最新バージョンであることを指摘してくれた @Dth に感謝します。

import java.util.concurrent.Executors
import scala.concurrent.{ExecutionContext, Future}

class ApplicationThread {
  protected implicit val context = 
    ExecutionContext.fromExecutorService(Executors.newSingleThreadExecutor())

  def run(code: => Unit) = Future(code)
}
于 2013-04-02T21:30:37.990 に答える
2

標準の同時実行ライブラリ以外にも、いくつかあります。たとえば、次のことができるcom.twitter/util-coreライブラリがあります。

val pool = FuturePool.unboundedPool
pool {
   <code>
}

あなたの例は次のようになります。

Thread.currentThread setName "MyThread"

// because you have to be using a single-threaded one to get the same name
val pool = FuturePool(Executors.newSingleThreadExecutor())

pool {
  Thread.currentThread setName "MySpecialThread"
}

pool {
  println(Thread.currentThread.getName) // MySpecialThread
}

println(Thread.currentThread.getName)
于 2013-04-02T20:45:04.817 に答える