Thread Nedir ve Nasıl Tanımlanır

848

Thread (İş Parçası)

Thread kelimesi türkçeye iş parçası olarak çevrilmiştir. İş yapan parça. Bu tanım üzerinden devam ettiğimizde Multi-thread in karşılığıda birden fazla iş parçaları olur.
Bu genel tanımdan sonra, Java programlama dili içerisinde thread kavramını incelemeye çalışalım.

Bir java uygulaması, varsayılan olarak birim zamanda tek bir iş yapacaktır. Bu ana iş parçası Main Thread olarak adlandırılır. Bir iş parçası içerisinde çağrılan tüm metotlar birbirlerinin bitişini beklemek zorundadır. Yani akış ardışıkdır. Bu ardışık mantık ve tek thread bazı durumlarda uygulama geliştirmemizi kısıtlar veya yetersiz performansa sebebiyet verir.

Bu durumları tek bir örnek üzerinden incelemeye çalışalım. Bunun için;
Soket aracılığı ile başka bir uygulamaya bağlanan, veri alan ve aldığı verileri işleyen bir uygulama yapmakta olduğumuzu düşünelim. Sadece ana iş parcasının olduğu bir uygulama bizim için uygun olmayacaktır.

  1.  Çünkü uygulama, verilen bilgiler ile bir sunucu uygulamaya bağlanacak ve soketi dinleyecektir. Sırası ile aşağıdaki gibi ilerleyen bir metot da;
    bilgileriAl();
    sunucuyaBaglanVeriBekle();
    ekranıCiz();
    .
    .
    .
    uygulama sunucuyaBaglanVeriBekle() metodundan sonra devam etmez. Çünkü bu metot yaptığı iş gereği uygulama çalıştığı sürece, sonlanmaması gereken bir metoddur. Sokete bağlan işini bir başka thread’in yapması gerekir.
  2. Soketten veri alındığı zaman, alınan bu veri üzerinde bazı işlemlerin yapılması gerekecektir. İşlemler yürütülürken, sunucu tarafından gönderilen yeni veriler alınamayacaktır. Verilerin işlenmesi işini başka bir thread’e yaptırabiliriz. Bu sayede sunucu tarafında veri yığılması engellenir. Uygulamamızın cevap verme süresi kısalır. Veri işleme işini bir den fazla thread’e yaptırdığımız durumda da uygulamamızın performansı artar.

Bu ve benzeri örnekler thread kullanmamız gereken durumları göstermektedir.

Bu faydaları yanında thread kullanımının bazı sakıncaları da mevcuttur. Bu sebeple yazılımcıya düşen, optimum noktayı bulabilmektir.

  1. Fazla sayıda thread kullanmamız uygulamayı karmaşık hale getirebilir.
  2. Thread’lerin kullandığı paylaşımlı veriler, sınıf örnekleri olabilir ve bunlara çok dikkat edilmesi gerekir.
  3. Thread’ler kendi local stacklerine sahiptir. Fazla sayıda thread daha fazla memory demektir. Out of Memory hatası alma ihtimalimiz artar.
  4. Fazla sayıda thread CPU switch işlemine ve performans kaybına sebep olur.

Bu girişten sonra thread tanımlamaya geçebiliriz.

Thread Tanımlama

Java’da thread tanımlamak için Thread sınıfını kullanırız. Bu sınıf java.lang paketinin altındadır.
Thread tanımı;

Bu şekilde bir thread tanımlamış olduk. Ama thread tarafından çalıştırılacak herhangi bir kod belirtmedik. Kod belirtme işlemini iki temel yol ile yapabiliriz.

  • Thread sınıfının bir alt sınıfı ile. Yani Thread sınıfını extend eden bir sınıf oluştururuz ve run metodunu override ederiz.Böylece thread tarafından çalıştırılacak kodu belirtebiliriz. Bu işlemi Thread sınıfının anonim sınıfını oluşturarakta yapabiliriz. Her iki yöntem için örneklerimiz şu şekilde;

Şimdi main metotu yazalım.

Kodumuzu çalıştırıdığımız da Merhaba Thread çıktısını almış olmamız lazım. İlk thread tanımımızdan farklı olarak, Thread yapılandırıcısına Thread sınıfı extend edip, run metodunu override eden ThreadSubClass sınıfımızın bir instance ini gönderdik. Böylece istediğimiz kod run metodu içinde çalıştı.

Anonim sınıf olarak ise Thread şu şekilde oluşturulur:

Programın çıktısı Merhaba Anonim Thread olucaktır.

  • Runnable interface’ini implemente ederek thread oluşturabiliriz. Alt sınıf oluşturduğumuz örnekten tek farkı Thread sınıfı extend edilmez, Runnable interface’i implement edilir.

Ana metodumuz:

Program çıktımızda Merhaba Runnable Thread olacaktır.

Thread oluştururken hem Thread sınıfının alt sınıfından hem de runnable interface implementasyonundan oluşturabiliriz. Genel yaklaşım Runnable implementasyonunun tercih edilmesi şeklindedir. Çünkü java da sadece tek bir sınıf extend edebiliriz ama birden fazla interface implemente edebiliriz. O yüzden interface bize daha fazla esneklik sağlar.

Thread başlatırken çok dikkat etmemiz gereken nokta, start() metodunu kullanmaktır. Thread i run metodunu çağırarakta başlatabiliriz. Ama bu durumda main thread akışı durur. Thread kodunun yönetilmesini ana iş parçası yapar. Bu sebeple thread başlatırken start metodunu kullanmalıyız.

Aşağıdaki örneğimizde thread’i hem start hem de run metotları ile başlatıp, uygulama çıktılarını inceleyelim.

Metot içerisine 2 saniyelik bekleme ekledik. Main metodumuz şu şekilde olacak:

main metot içerisinde start ile threadimizi başlattık. Uygulamanın çıktısı aşağıdaki gibi olacak:

 

Gördüğümüz gibi, main thread akışı herhangi bir kesintiye uğramadı. Şimdi aynı metot içinde thread’imizi run metodu ile çalıştıralım.

Çıktı:

Görüğümüz gibi, thread run ile çalıştırıldığında, main thread orada duraksadı ve thread’in metodu bitinceye kadar bekledi. O yüzden start metodunu kullanmaya dikkat edelim.

Thread İsimlendirme

Oluşturduğumuz threadlere isim verebiliriz. İsim vermek thread’leri izleyebilmemizi kolaylaştırır. Thread sınıfı, sınıf instance degeri ile beraber thread isminide alan bir yapılandırıcı sunar. Bunun yanında setName() metodunu çağırarak da isim verebiliriz. Her iki yöntem için örneklerimiz aşağıdadır.

Bu makalemizde, java ile thread konusuna giriş yaptık.

Ornek Uygulamalar

Şimdilik bu kadar. İnşallah faydalı olmuştur.

İyi Çalışmalar

Yorum yaz

Email adresiniz yayınlanmayacaktır.