Tek bir iş parçacığı üzerinde bir gelecek yürütülür. Birkaç iş parçacığında birkaç geleceği gerçekleştirilebilir. Yani, geleceğe daha fazla bir şey simültane olarak bir iş parçacığı işgal edebilir.
Nasıl çalışır? Bir Gelecek oluşturduğunuzda, bu, iş parçacığı havuzunuza görev gönderdiğiniz anlamına gelir - bu görev örtülü olarak paralelleştirilemez, dolayısıyla yalnızca bir iş parçacığında yürütülür. Havuza gönderilen bir veya daha fazla görev havuzun kuyruğuna yerleştirilir, bu nedenle yürütücü bu sıradan birer birer görevler alır ve her birini rastgele (veya kasıtlı olarak) seçilen iş parçacığı üzerinde çalıştırır. Bu yüzden birkaç Futures çeşitli konulara gidebilir.
Paylaşılan nesne hakkında - işlemler arasında paylaşılan nesne için güvenli bir şekilde işlem yapmanın tek yolu Executors.newFixedThreadPool(1)
kullanıyor, tüm havuz için yalnızca bir iş parçacığı kullanacak. Başka bir çözüm - her gelecek için böyle bir nesneyi klonlamaktır. Oyuncular (paylaşılan nesneyi bir oyuncunun durumuna getir) en iyi seçenek olmalı.
Gelecekte bir nesne kullanırsanız - her şey iyi olmalıdır.
Not: Geleceğin işleyicisi, Future{ ... }.map(handler)
gibi, geleceğin kendisinden farklı bir iş parçacığında gerçekleştirilebilir, ancak aslında bir sonuç elde etmek için başka bir Future
oluşturur. flatMap
için de geçerlidir. Daha doğrusu, eski Geleceğin başarıdan sonra (farklı bir iş parçacığı mümkün) işleyicisi başlatmak için CallbackRunnable
oluşturur onComplete
kullanmak - Bu geri arama sadece newely oluşturulan geleceği tamamlar, böylece yine "en fazla bir iş parçacığı gelecekte başına"
Teşekkürler! Tam olarak aradığım bilgiler buydu. Sadece hızlı bir takip sorusu - sadece bir iş parçacığı ile newFixedThreadPool çoklu vadeli teslim için herhangi bir avantaj var mı? Tek bir iş parçacığı üzerinde hesaplamalar eşzamanlı olabilir mi? –
Hiçbir performans avantajı yok. Size verebileceği tek şey eşzamansız API'dir (birden fazla görevi gönderin + tamamlanmalarına abone olun). Farklı türden geleceğe yönelik çeşitli havuzlar da oluşturabilirsiniz, ancak aktörler bunun için daha iyidir. – dk14
Implicit val executionContext = ExecutionContext.fromExecutorService (Executors.newFixedThreadPool (1)) 'ile' Executors.newFixedThreadPool (1) 'adlı bir' ExecutionContext 'oluşturun. – jpcooper