Java 8 Streams Paralel İşlemler - 3

Sinan Selimoglu
2 min readDec 4, 2016

--

Java 8'in asıl ezber bozan değişikliğine geldik. Önceki iki yazıda, streamlere genel bir giriş yaptık ve temel stream fonksiyonları ile yapabileceklerimizden bahsettik. Değinilen konular daha çok kod yazış stilimizi değiştirmeye yönelikti ancak performans tarafını incelemedik.

Aşağıdaki iki farklı kod bloğuda personel listesinin elemanlarını terminale basıyor.

Zaman : 48–59 ms
Zaman : 56-66 ms

İçinde 1000 eleman bulunan personel listesini basan bu iki örnekten, bugüne kadar kullandığımız foreach yapısı, işlemi daha hızlı tamamlıyor. Hızlanmayı beklerken daha yavaş bir sonuç elde ettik.

Başka bir örneğe geçelim. Bu örnekte; her elemanın bilgilerini başka bir servisten çektiğimizi düşünelim. Normal foreach yapısını ele alırsak; sırasıyla her bir personelin bilgilerini çekmek için istekte bulunacağız ve bu isteğin cevabı gelene kadar başka bir personelin bilgilerini çekemeyeceğiz. Ortalama servis cevabının 1 saniye olduğu bir senaryoyu, aşağıdaki gibi kodlayabiliriz.

Bu örnekte thread.sleep kullandığımız satırı, bilgileri çekmek için istek yaptığımız yer gibi düşünebiliriz.

Servisin sağladığı bir saniyelik gecikmeyi göstermek için thread.sleep’i 1000 ms olarak kullandık. 1 saniyelik bekleme süresinin ardından terminale bulunduğu thread ’in ismini yazdırdık. Çıktı aşağıdaki gibidir.

Bütün işlemler main thread üzerinden, yani tek bir thread de, gerçekleştiği için normal olarak 10 saniye sonunda işlem tamamlandı. Aynı işlemi şimdi bir de parallelStream methodu ile yapıyoruz.

Burada ise paralel streami kullandık, isminden anlaşılacağı üzere foreach’in içerisindeki hesaplamayı paralel (birden fazla thread)yönetmesi gerekiyor. Verdiği output ise aşağıdaki gibidir.

Bu sefer işlemimiz iki saniyede tamamlandı ve main thread harici bir çok thread ismi görüyoruz. ParallelStream fonksiyonu sizin için java’nın ForkJoinPool implemantasyonunu kullanarak, bir thread havuzu (varsayılan olarak 7 thread) ile for ’un içerisindeki işlemlerinizi farklı thread üzerinde çalıştırıyor. Böylece bir isteğin cevabını beklemeye gerek kalmadan, listedeki diğer elemanları işlemeye devam edebiliyoruz. Sonuç olarak 10 sn’de gerçekleştirdiğimiz işlem, parallelStream ve ForkJoinPool yardımı ile 2 sn’de gerçekleşiyor.

Son olarak ZeroTurnAround ‘ın hazırladığı stream api cheatsheet’e bakmanız da fayda var.

--

--