- Katılım
- 2 Ara 2022
- Mesajlar
- 52
Thread nedir?
Her bir işlemin altında çalışan alt işlemlere thread adı verilir.Aynı anda birden fazla işlem yapmayı sağlayan yapıya thread denir.
Bu yapı sayesinde işlemler birbirlerini beklemeden kendi işlemini yapar.
Kullanıcı bir form üzerinden web isteği başlattığında web isteği cevap verene kadar kullanıcı form üzerinde işlem yapamayacaktır.
Benzer şekilde ağ programlama işlemleri sırasında karşı taraftan bir cevap beklenmeye alındığında program üzerinde işlem yapılmayacaktır.
Bu ve bunun gibi durumlarda thread yapısının kullanımı iyi bir kullanıcı deneyimi için faydalı olacaktır.
Aşağıdaki örnek thread kullanılmadan yapılmıştır.
Java:
public class ThreadOrnegi {
public static void main(String[] args) {
uzunBirIslem();
System.out.println("Merhaba Thread");
}
private static void uzunBirIslem() {
try {
// Burada uzun bir işlem yapılıyor.
Thread.sleep(5 * 1000);
System.out.println("Uzun işlem sonucu");
} catch (InterruptedException ex) {
System.err.println(ex);
}
}
}
Thread kullanımı
Thread kullanımı için Thread sınıfını kalıtım almak(extends) veya Runnable arayüzünü uygulamak(implements) olmak üzere iki yöntem kullanılır.Thread sınıfının kullanımı için Thread sınıfı kalıtım alındıktan sonra run metodu ezilir(override) ve gerekli komutlar yazılır.
Java:
public class ThreadOrnegi extends Thread {
public static void main(String[] args) {
ThreadOrnegi threadOrnegi = new ThreadOrnegi();
threadOrnegi.start();
System.out.println("Merhaba Thread");
}
@Override
public void run() {
try {
// Burada uzun bir işlem yapılıyor.
Thread.sleep(5 * 1000);
System.out.println("Uzun işlem sonucu");
} catch (InterruptedException ex) {
System.err.println(ex);
}
}
}
Runnable arayüzünün kullanımı için arayüz metotları sınıf tarafından uygulanır(implements).
Arayüz uygulandıktan sonra Thread sınıfının kurucusuna sınıf parametre olarak geçilerek thread çalıştırılır.
Java:
public class ThreadOrnegi implements Runnable {
public static void main(String[] args) {
Thread t1 = new Thread(new ThreadOrnegi());
t1.start();
System.out.println("Merhaba Thread");
}
@Override
public void run() {
try {
// Burada uzun bir işlem yapılıyor.
Thread.sleep(5 * 1000);
System.out.println("Uzun işlem sonucu");
} catch (InterruptedException ex) {
System.err.println(ex);
}
}
}
NOT: Java çoklu kalıtımı desteklemediğinden Runnable arayüzünün kullanımı faydalı olacaktır.
Thread yönetimi
Birden fazla thread aynı anda tek bir kaynağı kullanmaya çalıştığında belirsiz durum ortaya çıkar.
Java:
public class ThreadOrnegi implements Runnable {
public static void main(String[] args) {
Thread t1 = new Thread(new ThreadOrnegi());
Thread t2 = new Thread(new ThreadOrnegi());
t1.start();
t2.start();
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName());
}
}
}
Bu belirsizliğin önüne geçmek için thread’ler arasında senkronizasyon iyi bir şekilde yapılması gerekir.
Senkronizasyonun iyi bir şekilde yapılması için çeşitli teknikler kullanılır.
Senkronizasyon için threadler belirli bir süre durdurulabilir.
Java:
public class ThreadOrnegi implements Runnable {
public static void main(String[] args) {
Thread t1 = new Thread(new ThreadOrnegi(1000));
Thread t2 = new Thread(new ThreadOrnegi(2000));
t1.start();
t2.start();
}
int sure;
public ThreadOrnegi(int sure) {
this.sure = sure;
}
@Override
public void run() {
try {
Thread.sleep(this.sure);
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName());
}
} catch (InterruptedException ex) {
System.err.println(ex);
}
}
}
Diğer bir yöntem ise synchronized anahtar kelimesini kullanmaktır.
Java:
public class ThreadOrnegi implements Runnable {
public static void main(String[] args) {
Thread t1 = new Thread(new ThreadOrnegi());
Thread t2 = new Thread(new ThreadOrnegi());
t1.start();
t2.start();
}
@Override
public void run() {
synchronized (ThreadOrnegi.class) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName());
}
}
}
}
Java:
public class ThreadOrnegi implements Runnable {
public static void main(String[] args) {
Thread t1 = new Thread(new ThreadOrnegi());
t1.setPriority(Thread.MIN_PRIORITY);
Thread t2 = new Thread(new ThreadOrnegi());
t2.setPriority(Thread.MAX_PRIORITY);
t1.start();
t2.start();
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName());
}
}
}
Java ile thread kullanımı bir sınıf kullanımından farksızdır.
Ancak thread senkronizasyonunun yapılan işlem türüne göre iyi hazırlanması gerekir.
Senkronizasyon iyi yapılmadığında beklenmedik sonuçlar ortaya çıkar ve yeterli verim alınmayabilir.
Thread yönteminin verimli bir şekilde kullanılması için ayrıca problemin-algoritmanın parçalara ayrılabiliyor olması gerekir.
Son düzenleme: