Получает ли будущее новую нить?

Получит ли будущее, реализованное, как показано ниже, новую тему? Видимо это не так (см. Вывод ниже). Зачем? Что мне делать, если я хочу, чтобы мой код запускался в новом потоке?

package MyTest

import com.twitter.util._

import scala.language.postfixOps

object Test {

  def test1 = Future {
    println("BeforeTest", Thread.currentThread())
    Thread.sleep(5000)
    println("AfterTest", Thread.currentThread())
  }

  def test2 = test1 onSuccess { case _ => println("Future on success") }

  def main(args: Array[String]): Unit = {

    println("main", Thread.currentThread())
    test2
    println("main123", Thread.currentThread())
  }
}

Выход:

(Основная, резьба [выполнение основного 0,5, выполнение главной группа 0])

(BeforeTest, Тема [выполнение основного 0,5, выполнение главной группа 0])

(AfterTest, Тема [выполнение основного 0,5, выполнение главной группа 0])

Будущее на успехе

(Main123, резьба [выполнение основного 0,5, выполнение главной группа 0])

2 ответа

Решение

Вы используете фьючерсы в твиттере, а не фьючерсы на scala. Фьючерсы на Twitter не являются многопоточными по умолчанию. Вы должны использовать FuturePool (передавая ему ExecutorService с вашим выбором потоков)

Непроверенный пример (достаточно простой, чтобы работать, я надеюсь:)):

val executor = Executors.newFixedThreadPool(4)
val pool = FuturePool(executor)

def test1 = pool { 
  println("BeforeTest", Thread.currentThread())
  Thread.sleep(5000)
  println("AfterTest", Thread.currentThread())
}

def test2 = test1 onSuccess { case _ => println("Future on success") }

def main(args: Array[String]): Unit = {

  println("main", Thread.currentThread())
  test2
  println("main123", Thread.currentThread())

  executor.shutdown()
}

Один из интересных моментов FutureЭто то, что вам не нужно обрабатывать потоки самостоятельно. Как они выполняются, полностью зависит от неявного ExecutionContext что передается Future.apply() метод (и другие методы, такие как map, flatMap, filter, так далее.). Очень грубая реализация может создать новый поток для каждого вычисляемого будущего, но в основном происходит то, что такой код выполняется пулом рабочих потоков в JVM.

Другие вопросы по тегам