Burak IŞIKLI :))

Multi-Threaded(Çok Kanallı) Programlama

Posted in Java by Burak IŞIKLI on 16 Haziran 2009

Çok Kanallı Programlama (Multi-Threaded Programming), bir programda aynı anda birden fazla işin yapılabilmesidir. Yani bir kod parçası bir işlemi gerçekleştirirken aynı anda ona paralel olarak bir başka kod parçasının çalışması demektir. Birbirine paralel çalışan çalışanlardan her birine kanal (thread)

Java çok kanallı porgramlamayı temelden desteklemektedir. Yani çok kanallılık dile bir takım kütüphanelerle eklenmemiştir. Aslında her Java programı bir kanalda (thread’te) çalışır. Örneğin application’ların main method’unun çalıştırılmasıyla adı ‘main’ olan bir ana thread çalıştırılır. Ancak tek bir kanal olunca programcı yazdığı kodun bir thread’in içerisinde çalıştığını farketmez.  Thread bize eş zamanlı birden fazla işi yapma fırsatını yani multitasking sağlıyor.

Thread’in faydaları:

  • Kaynak paylaşımı
  • Daha az bekleme süresi
  • Daha verimli donanım kullanımı(Multiprocessor kullanımı)

Yeni bir thread yaratıldığında biz start komutu vermedikçe thread çalışmaya başlamıyor hazır durumda bekliyor. Biz start komutunu verdiğimizde çalışmaya başlıyor. Ayrıca thread’i sleep komutu ile belli süre bekletebiliyor, stop komutu ile öldürebiliyoruz.  Peki ama thread ile multithread arasında ne fark vardır?

multithread

Resimde gördüğümüz gibi threadler aynı kodu, veriyi ve dosyaları kullanmasına rağmen farklı register ve stack’leri vardır. Bu sayede aynı kod içinde farklı işler yapıp farklı şeyleri hafızada tutabiliyor. Java’da thread yaratmanın iki yolu var. Ben implement ederek kullandım. Ancak extend ederek de thread yaratılabilir. Thread pool diye bir kavram da var. Siz belirli bir thread sayısı veriyorsunuz. Thread pool boşta olan thread’i kullandırıyor. Multihreading yaşanabilecek en önemli sorunlardan biri, concurrent(eş zamanlılık) ve senkronizasyon sorunu. Siz aynı anda hem ekleme hem de silme yapmamınız gerekiyor. Aksi takdirde istediğinizi eklemeden hangi elemanı almaya çalışırsanız hangisini alacaksınız gibi bir soru karşımıza çıkıyor. Bunu çözmenin 3 yolu var:

  • Producer-consumer problemi: İşletim sistemleri dersinde öğrendiğimiz aynı mantık üretici-tüketici problemiyle çözebiliriz.
  • Circular buffer: Producer-consumer problemi benzer bir çözüm. Farkı kendiniz bir dizi oluşturuyorsunuz ve kilit kontrolü bu dizide oluyor.
  • Java collections: Kendimiz kilitlerle uğraşmadan bu işi java’ya bırakabiliriz. Java’nın bu konulara kendi çözüm getirdiği collections sınıfını kullanabiliriz.

Basit bir thread örneği(ThreadTest.java):


import java.util.*;

public class ThreadTest implements Runnable {
 public void run() {
 while (true) {
 try {
 Thread.sleep(1000);
 System.out.println("Other thread time : " + new Date());
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 }

 public static void main(String[] args) {
 ThreadTest test = new ThreadTest();
 Thread thread = new Thread(test);
 thread.start();
 System.out.println("Main thread");
 }
}

Bu programda ekrana “main thread” yazdıktan sonra  threadimiz başlatılarak 1 saniye aralıklarla tarihi ekrana yazıdırıyor.

Bir Yanıt

Subscribe to comments with RSS.


Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: