Birden fazla işlemin tek bir program akışı içinde gerçekleştirilmesi Java'da Thread sınıfları sayesinde gerçekleştirilmektedir. Şu ana kadar yaptığımız bütün örnekler ana program akışını takip ederek gerçekleştirilen işlemleri içermekteydi. Thread (iş parçacığı) kullanımı, birden fazla işlemin tek bir akışı paylaşarak neredeyse eşzamanlı bir şekilde gerçekleşmesini sağlar.
Thread kullanımına en iyi örnek oyun uygulamalarıdır. Kelime oyunu uygulamasında kullanıcının ana ekranda oyunu oynadığını düşünelim. Biz ise tam oyunun en heyecanlı yerinde rasgele bir reklam gösterip kullanıcının bütün dikkatini reklama yöneltmek isteyelim :). Bu amaçla bizim reklamı uzaktaki bir sunucudan çekip ana ekrana basan bir kod parçası yazmamız gerekmektedir. Uzaktan dosya yükleme uzun bir işlem olduğu için işlem sırasında oyunu bloke etmememiz gerekir. Bu yüzden Thread mantığını kullanan bir kod yazarak ana akışta hem oyunu hem de yükleme işlemini ilerleterek iki işlemin de mevcut kaynakları paylaşarak kullanmasını sağlayabiliriz. Bu sayede hem kullanıcı oyununu kesintisiz oynamaya devam eder hem de reklam dosyaları uygulamaya yüklenmiş olur.
NOT: Uzaktan dosya yükleme işlemleri için bu sistemi ileri Android derslerinde sık sık kullanıyor olacağız.
Java'da Thread kullanan program örneği ise aşağıda verilmiştir;
public class MyThread implements Runnable {
private int end;
private String name;
public MyThread(String name, int end) {
this.end = end;
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < end; i++) {
System.out.println(name + " : " + i);
}
}
}
Thread içerisinde gerçekleştirilecek işlemler öncelikle Runnable Interface'ten üretilmiş herhangi bir sınıfta tanımlanmalıdır. Yukarıda yer alan örnek kodda MyThread adında tanımlanmış bir iş parçacığı bulunmaktadır. Runnable içerisindeki run metodu içinde ise yapılması gereken işlemler belirtilir. Örnek kod yapıcı (constructor) metot içinde verilen bir int değeri kadar sayma işlemi yapacak ve bunu konsola Thread'e verilen isimle birlikte yazacaktır.
public class ThreadLesson {
public static void main(String[] args) {
Thread thread1 = new Thread(new MyThread("thread1", 6));
Thread thread2 = new Thread(new MyThread("thread2", 5), "thread2");
thread1.start();
thread2.start();
}
}
MyThread adlı iş parçacığını çalıştırmak için Thread adlı sınıftan faydalanırız. Yukarıdaki örnekte farklı Thread tanımlamaları ve bunların kullanımları görülmektedir. Thread'ler tanımlanırken yapıcı içerisinde Thread'e ait bir isim de verilebilir. Yukarıdaki kodun çıktısı aşağıdaki gibidir;
thread1 : 0
thread2 : 0
thread2 : 1
thread2 : 2
thread1 : 1
thread2 : 3
thread1 : 2
thread2 : 4
thread1 : 3
thread1 : 4
thread1 : 5
Eğitimin alt başlıklarında threadler ile alakalı setPriority methodu ve Executor Sınıfı hakkında anlatımlar ve örnekler yapacağız.