Senkron vs Asenkron Programlama

Senkron programlama, yazılımda her bir işlemin sıra ile yapılmasıdır. Örneğin süpermarketlerdeki kasa kuyruğunda bir önceki müşteri, ürünlerinin ödemesini yapmadan sizin ürünlerinize sıra gelmemektedir.

Beklerken yaşanan zaman kaybı Asenkron programlamada ortadan kalkar. Asenkron programlama; işlemlerin birbirini beklemeden , bağımsız olarak gerçekleşmesidir. Süpermarket örneğinden devam edecek olursak, Asenkron programlama; her müşterinin sıra beklemeden istediği kasadan ödeme yapabilmesini sağlamaktadır.

Java programlama dili Java 8 ile birlikte Asenkron programlamaya da ilgisini arttırmıştır. CompletableFuture arayüzü Java’nın Asenkron programlama için kullanılan bir sınıfıdır. CompletableFuture java.util.concurrent paketi içinde bulunmaktadır. Java 8 öncesi Guava Framework’un de ListenableFuture olarak kullanılmaktadır.

CompletableFuture sınıfı temelde Future ve CompletionStage arayüz sınıflarından türemektedir. CompletionStage arayüzü callback methodların, Future sınıfı ise Asenkron işlemlerin hesaplanmasını kapsamaktadır. CompletableFuture sınıfı toplamda 59 adet metot içermektedir. Tüm metotları detaylı olarak buradan inceleyebilirsiniz. CompletableFuture arayüzü ile geliştirdiğimiz programda, sık kullanılan işlemlerin süresini azaltabiliriz.

Peki ya Senkron çalışan bir metot, Asenkron olarak nasıl kullanılır?

Senkron çalışan örnek

    interface UserService { 
    User findUserById(String userId); 
    }
    class UserServiceImpl implements UserService {
     
    @Override 
    User findUserById(String userId) { 
     return findUser(userId); 
     } 
     private User findUser(String id) {  } 
    }

Asenkron çalışan örnek

    interface UserService { 
    CompletableFuture<User> findUserById(String userId); 
    }
    class UserServiceImpl implements UserService { 
    @Override 
    CompletableFuture<User> findUserById(String userId) { 
     return CompletableFuture.supplyAsync(() -> findUser(userId)); 
     } 
    private User findUser(String id) {  }
    }

CompletableFuture’da dikkat edilmesi gereken en önemli nokta; Asenkron işlemleri Senkron’a dönüştürmemektedir. Örneğin; CompletableFuture arayüzünün sahip olduğu .join() metodu, ilgili işlem tamamlanana kadar diğer tüm işlemleri bekletmektedir. Bu yüzden art arda çağrılan işlemlerde join kullanmamaya dikkat edilmesi gerekmektedir. Bunun yerine .get(long timeout, TimeUnit unit) metodu kullanılabilir. Bu metot sayesinde çok uzun süren işlemlerin, diğer işlemleri bekletmemesi için o işleme bir time out değeri verilir ve işlemlerin birbirini engellemesinin önüne geçilir.

Sonuç olarak Asenkron programlamayı Senkron programlamayla karşılaştırırsak; Asenkron programlama, işlemlerimizi daha hızlı yapmamızı sağlamaktadır.Java programlama dili Java 8 ile çıkarmış olduğu CompletableFuture arayüzünü Java 9 ile de geliştirmeye devam etmektedir.

Kolay Gelsin.. 🤞