2016-03-29 25 views
1

Genellikle, bir tedarikçi, bir akümülatör ve bildiğim kadarıyla bir birleştirici ile birleştirilir özel akışı kollektörü, yazıyorum. Benim custome toplayıcı, ben akümülatör evreli olmadığını biliyoruz, bu yüzden birleştirici null olmak kurmak ve Collector.CharacteristicsIDENTITY_FINISH ol. Kodlar derlemeyi geçebilir, ancak çalışma zamanı istisnası vardır, çünkü birleştirici null olmayacaktır, bu zaten NotNull ek açıklamasında belirtilmiştir.Java 8'de özel bir akış toplayıcıyı nasıl işleyebilirim?

Sorum şu: Collector.CharacteristicsIDENTITY_FINISH olan toplayıcımda bir birleştirici sağladığımda, akümülatör paralel olarak (veya aynı anda) veya yalnızca yarış sorunu olmadan tek bir iş parçacığında mı çalışır?

+0

Toplayıcınızın paralel olarak kullanılmasını istemiyorsanız, birleştiriciyi uygularken bir istisna atabilirsiniz, ancak 'CONCURRENT' karakteristiğini bildirmediğiniz sürece, toplayıcının iş parçacığının olması gerekmez. - güvenli AFAIK –

cevap

4

Sen (tedarikçi, akümülatör, birleştirici ve son işlemcinin dahil) toplayıcı kullanılan herhangi bir işlev için null kullanamazsınız. Eğer Collector kullanabilirsiniz Bundan sonra

(a, b) -> {throw new UnsupportedOperationException("Combining is not supported");} 

: Eğer uygun bir birleştirici sağlayamaz ortak çözüm atma lambda geçmektir. Bu hala Collector arayüzü gibi kötü bir uygulama olmasına rağmen, birleştirici uygulanmasına izin vermez.

açıkça CONCURRENT karakteristik belirterek sürece, sen parçacığı güvenliği konusunda endişelenmenize gerek yok unutmayın. Kollektörünüz eşzamanlı değilse, paralel akış tedarikçiyi ayrı iş parçacığında arayacak, ardından bağımsız olarak oradaki akümülatörü kullanacak ve son olarak yalnızca birikimin tamamlanmasından sonra birleştiriciyi arayacaktır. Kollektörlerin bütün noktası: Eşzamansız toplayıcı için iplik güvenliğini gerektirmediği garanti edilir, aynı konteyner ile eş zamanlı operasyonlar gerçekleştirilmez. Bu yüzden tedarikçi gerekli: her iplik için birkaç bağımsız kap oluşturmak için birkaç kez çağrılabilir.

Son olarak bir sonlandırıcı yoksa, açıkça IDENTITY_FINISH belirtmek gerekmez unutmayın. Sadece IDENTITY_FINISH özelliği otomatik olarak eklenecek

Collector<?,?,?> myCollector = Collector.of(mySupplier, myAccumulator, myCombiner); 

kullanın.

İlgili konular