2016-04-09 13 views
1

okudum: Bu olay kaydeder parçacığı üzerinde çalışmaz tekrar-print deyimi vurgulamak önemlidirScala futures - hangi iş parçacığı üzerinde çalışır? Jason Goodwin tarafından Öğrenme Akka ise

val future = getUsernameFromDatabaseAsync(userId) 
future.onComplete(username => 
    //executed somewhere else 
    println(username) 
) 

. ExecutionContext aracılığıyla başka bir iş parçasında başka bir yerde çalışır. Vadeler her zaman ExecutionContext ile oluşturulur, böylece bunları çalıştırmak için nerede seçebilirsiniz.

Ve meraktan kendim kontrol etmek istedim, bu yüzden bir pasajı hazırlanan:

val myFuture = Future { 
    println("in future: " + Thread.currentThread().getName()) 
    Thread.sleep(1000) 
} 

myFuture.onComplete { 
    case _ ⇒ println("in onComplete: " + Thread.currentThread().getName()) 
} 

println("main: " + Thread.currentThread().getName()) 

Await.result(myFuture, 10 seconds) 

aşağıdaki çıktıyı ben parçacığını çalıştırmak her zaman olsun.

main: main 
in future: ForkJoinPool-1-worker-13 
in onComplete: ForkJoinPool-1-worker-13 

Gelecek ve onComplete aynı iş parçacığı üzerinde yürütülen, ancak kitap onComplete farklı bir iş parçacığı üzerinde geri yürütmek olabileceğini söylüyor edilir. Nasıl açıklanır?

cevap

3

Olayı kaydeden iş parçacığı, geleceği çalıştıran iş parçacığı değil, ana iş parçacığı olduğu için. Bu durumda, iş parçacığı ana üzerinde değil, bunun yerine iş parçacığı ForkJoinPool-1-worker-13

iş parçacığı üzerinde çalıştırılmadı. OnComplete ve gelecekteki aynı iş parçacığı üzerinde çalışabilir, çünkü onComplete yalnızca ileride sona erdikten sonra başlar. Dokümantasyon, ana kaynaktan farklı bir iş parçacığı üzerinde çalışacaklarını belirtir.

İlgili konular