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