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.

Categorized in:

Java,

Last Update: 19 Kasım 2024