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