Java Stream API ve Paralel İşlemler Nasıl Kullanılır?
Stream API’nin dikkat çeken diğer bir özelliği ise paralel işlem desteğidir. parallelStream()
metodu kullanılarak, büyük veri kümeleri üzerinde paralel işleme yapılabilir ve böylece işlem süresi kısaltılabilir. Paralel işlemler, çok çekirdekli işlemcilerde veriyi aynı anda birden fazla iş parçacığında işleyerek performans avantajı sağlar.
ParallelStream Kullanımı
Paralel işlem kullanarak veri setlerini daha hızlı bir şekilde işlemek mümkündür. parallelStream()
, Stream API’nin standart bir akışı üzerinde paralel işlem yapabilmenizi sağlar. Örneğin:
List<Integer> bigList = IntStream.range(1, 1000000).boxed().collect(Collectors.toList());
long startTime = System.currentTimeMillis();
bigList.parallelStream()
.filter(n -> n % 2 == 0)
.forEach(n -> process(n)); // "process" burada zaman alan bir işlem
long endTime = System.currentTimeMillis();
System.out.println("Geçen Süre: " + (endTime - startTime) + " ms");
Yukarıdaki örnekte, bigList
isimli büyük bir liste üzerinde parallelStream()
kullanarak sadece çift sayıları filtreledik ve her birini işledik. Bu sayede, işlemler birden fazla çekirdekte paralel olarak yürütüldü ve performans avantajı sağlandı.
Paralel İşlemler için Dikkat Edilmesi Gerekenler
- Küçük Veri Setlerinde Kullanım: Küçük veri setlerinde paralel işlem kullanmak, bazen ek bir performans yüküne neden olabilir. Paralel işleme geçiş sırasında iş parçacıklarının oluşturulması ve senkronizasyon maliyeti, veri seti küçükse performansı olumsuz etkileyebilir.
- Thread-Safe Olmayan Yapılar: Paralel işlemler sırasında, üzerinde çalışılan veri yapısının thread-safe olup olmadığına dikkat edilmelidir. Eğer veri yapısı eşzamanlı erişime uygun değilse, paralel işlemler veri bütünlüğünü bozabilir ve beklenmedik hatalara neden olabilir.
- Ortam ve İşlemciler: Paralel işlemler, çok çekirdekli işlemcilerde daha büyük bir avantaj sağlar. Bu nedenle, uygulamanızın çalıştığı ortamın çok çekirdekli olmasına dikkat etmelisiniz.
Ekstra Kod Örnekleri
1) Sayıları Paralel Olarak Toplama
Aşağıdaki örnekte, parallelStream()
kullanarak çift sayıları topluyoruz.
int sumOfEvenNumbers = IntStream.range(1, 1000000)
.parallel()
.filter(n -> n % 2 == 0)
.sum();
System.out.println("Çift sayıların toplamı: " + sumOfEvenNumbers);
parallel()
metodu ile akışı paralel hale getirdik ve çift sayıların toplamını çok daha hızlı bir şekilde elde ettik.
2) Paralel İşlemlerle Büyük Listeyi Sıralama
Paralel akış kullanarak büyük bir listeyi sıralamak da mümkündür.
List<String> cities = Arrays.asList("İstanbul", "Ankara", "İzmir", "Bursa", "Adana", "Antalya", "Diyarbakır");
List<String> sortedCities = cities.parallelStream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedCities);
Yukarıdaki örnekte, parallelStream()
ile şehirleri paralel olarak sıralayıp sonucu bir listeye topladık. Bu yöntem, çok büyük veri setleri üzerinde performans artışı sağlayabilir.
Paralel Stream ve Performans Testleri
Paralel işlemler performans açısından cazip olabilir, ancak her durumda uygun olmayabilir. Performans kazancı sağlamak için paralel işlemleri kullanmadan önce şu soruları sormak önemlidir:
- Veri Seti Ne Kadar Büyük? Paralel işlemler, büyük veri setleri üzerinde daha etkili sonuçlar verir.
- İşlem Ne Kadar Karmaşık? Karmaşık işlemler paralel olarak yürütüldüğünde büyük performans kazanımları elde edilebilir.
- Veri Seti Paylaşımlı mı? Paralel işlemler sırasında aynı veri setine birden fazla iş parçacığı erişiyorsa, veri tutarlılığını sağlamak önemli hale gelir.
Not: ParallelStream işleminden önce bir custom order yapınız varsa bu yapı bozulacaktır. Bundan dolayı ParallelStream işleminden sonra gerçekleştirmelisiniz.
Bölüm 3’te, Java Stream API’nin paralel işlem özelliklerini ve parallelStream()
metodunun nasıl kullanılacağını ele aldık. Paralel işlemler, özellikle büyük veri setleri üzerinde performans artışı sağlamak için kullanışlıdır, ancak dikkatli kullanılmalıdır. Bir sonraki bölümde, Stream API’nin çeşitli kullanım örneklerine daha ayrıntılı bir şekilde bakacağız ve daha fazla pratik uygulama göreceğiz.
- Java Concurrency ve Multithreading Bölüm 1: Java’da Thread Nedir?
- Java’da Hangi Konulara Değineceğiz? Spesifik Konulara Genel Bakış
- Java Stream API ve Functional Programming Bölüm 3: Stream API ve Paralel İşlemler
- Java Stream API ve Functional Programming Bölüm 2: Fonksiyonel Programlama Nedir?
- Java Stream API ve Functional Programming Bölüm 1: Stream API Nedir?