Sponsor Reklam 


16.05.2009 (00:04)

 Thread Sınıfı ve Kullanımı 
Thread'ler çok kanallı programlama (multiprogramming, multitasking) için önemli bir mekanizmadır. Java'nın da desteklediği bu sınıf aynı anda birden fazla iş yapabilmemizi ya da başka değişle farklı iş parçacıklarının aynı zamanda çalışmasını sağlamaktadır.

Thread'ler process'lerle karıştırılmamalıdır. Bir process'te birden fazla thread çalışırken ve bunların çalışmaları programlanırken (scheduling) işletim sistemine göre aynı anda birden fazla process çalışmayabilir (multiprocessing). Bu o işletim sisteminin yeteneği ile ve CPU (işlemci) sayısının birden fazla olması ile ilgilidir.

Şimdi bu sınıfın kullanımına bakalım. Kendi thread sınıflarımızı oluşturmak için sınıf oluşturduktan sonra Thread sınıfını genişletiriz (extend). Yapcağımız işlemleri kendi sınıfımızda run() metodu oluşturarak içinde yaparız. Bu kanal çalıştırılacağı zaman start() metodu çağırılır.

Şu örneğe bakalım:

Main.java:
package kodcu.net;

public class Main {

  // Constructor
  public Main() {}

  public static void main(String[] args) {

    ThreadDemo td1 = new ThreadDemo(1);
    ThreadDemo td2 = new ThreadDemo(2);
    ThreadDemo td3 = new ThreadDemo(3);
   
    td1.start();
    td2.start();
    td3.start();
   
  }

}

ThreadDemo.java:
package kodcu.net;

public class ThreadDemo extends Thread {
  private int id;
  public ThreadDemo(int id) {
    this.id = id;
  }

  public void run() {
   
    for (int i = 0; i < 10; i++) {
      System.out.println("Thread ID: " + id + " Number: " + i);
    }

  }
}

Ekran çıktısı şu şekildedir:
Thread ID: 2 Number: 0
Thread ID: 2 Number: 1
Thread ID: 2 Number: 2
Thread ID: 2 Number: 3
Thread ID: 2 Number: 4
Thread ID: 2 Number: 5
Thread ID: 2 Number: 6
Thread ID: 2 Number: 7
Thread ID: 2 Number: 8
Thread ID: 2 Number: 9
Thread ID: 1 Number: 0
Thread ID: 1 Number: 1
Thread ID: 1 Number: 2
Thread ID: 3 Number: 0
Thread ID: 1 Number: 3
Thread ID: 3 Number: 1
Thread ID: 1 Number: 4
Thread ID: 3 Number: 2
Thread ID: 1 Number: 5
Thread ID: 3 Number: 3
Thread ID: 1 Number: 6
Thread ID: 3 Number: 4
Thread ID: 1 Number: 7
Thread ID: 1 Number: 8
Thread ID: 1 Number: 9
Thread ID: 3 Number: 5
Thread ID: 3 Number: 6
Thread ID: 3 Number: 7
Thread ID: 3 Number: 8
Thread ID: 3 Number: 9

Görüldüğü gibi kanal kendi içerisinde sıralı çalışırken hangi kanalın önce davranacağı konusu belirli değildir. Kanalların aynı anda çalışma mantığı bunu gerektirir. Önemli olan verilen zaman içerisinde bu kanalların birlikte koşmasıdır (run).

Bir kanalın ayakta olup olmadığını isAlive() metodu ile öğrenmekteyiz. Kanalın uyumasını sleep(long) metodu ile sağlarız. Kanal içerisinde de Thread.sleep(long) metodu ile sağlayabiliriz.

Kanalı oluşturup istediğimiz zaman çalışmasını istersek şöyle bir yol izleyebiliriz. Burada kanala yapılan metod çağrılarında sıralı işlem yapılması için synchronized anahtar kelimesini (keyword) kullanacağız.

    public synchronized void run() {
        while (true) {
            try {
                wait();
            } catch (InterruptedException ie) {
                // ie
                //System.out.println("InterruptedException");
            }
            connect();
        }
    }
   
    public synchronized void go() {
        notify();
    }

    private void connect() {
        // işlemler
    }

Burada da wait() metodu ve notify() metodunu görüyoruz. Bu metotlar Object sınıfının metotlarıdır ve kanalı wait() ile beklemeye alırız notify() ile uyandırırız.

Kanalların çalışma anları için öncelik verebiliriz. Bunu da Thread sınıfının setPriority(int) metodu ile sağlarız. Öncelik değerleri 0-10 arasındadır ve bunla ilgili tanımlı bazı sabitler şunlar:
Thread.MIN_PRIORITY =1
Thread.NORM_PRIORITY =5
Thread.MAX_PRIORITY=10

Çok fazla kanalla çalışırken boşta duran kanalın işgalini önlemek için yield() metodunu kullanmaktayız. Bekleme sırasında yüksek veya eşit önceliğe sahip kanalların çalışmasına izin verir.

join() metodu, kanalın belirli süre veya ölene kadar beklemesini sağlar.

interrupt() metodu wait halindeki veya sleep halinde de olabilen kanalın uyandırılmasını (kesme işlemini) sağlamaktadır. Kanalın kesme durumunda olup olmadığı da isInterrupted() metodu ile öğrenilmektedir.

Kanalı öldürmek için stop() veya destroy() metotları kullanılmaktadır.
Imza: admin








Yazilar kaynak gosterilmeden kopyalanamaz © www.kodcu.net // Twitter