Java’da Multithreading – Bölüm 13: Threadlerin Yarıda Kesilmesi (Interrupting)

Bu zamana kadar ki örneklerimizde “InterruptedException” istisnası ile sıkça karşılaştık. Bu istisna bir threadin çalışması yarıda kesildiğinde fırlatılır. Peki çalışmakta olan bir threadin çalışması nasıl yarıda kesilir? Gelin yaptığı işlem uzun süren bir threadi belli süre geçtikten sonra durdurmayı deneyelim. Bunun için “Thread” sınıfının sağladığı “interrupt()” metodunu kullanacağız:

public class Application {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("Başladı.");

        Thread t = new Thread(() -> {
            for (int i = 0; i < 1E8; i++) {
                Math.sin(new Random().nextDouble());
            }
        });

        t.start();

        Thread.sleep(500);

        t.interrupt();

        t.join();

        System.out.println("Bitti.");
    }

}

Programın çalışması bittiğinde çıktısının şu şekilde olduğunu göreceksiniz:

Başladı.
Bitti.

Benim gibi siz de “InterruptedException” istisnasının fırlatıldığını görmeyi beklemişsinizdir. Ancak gerçek şu ki “interrupt()” çağrısı yalnızca bir bayrağı (flag) bu threadin çalışmasının yarıda kesildiğini belirtecek şekilde ayarlar. Threadin çalışmasını durdurmak için döngü içerisinde “Thread.currentThread().isInterrupted()” kontrolünü yaparak döngüyü sonlandırmak bize kalmış durumda:

Thread t = new Thread(() -> {
    for (int i = 0; i < 1E8; i++) {
        if (Thread.currentThread().isInterrupted()) {
            System.out.println("Thread durduruldu!");
            break;
        }

        ...
    }
});

Programı bu değişiklik sonrasında çalıştırdığımızda çıktı şu şekilde olacaktır:

Başladı.
Thread durduruldu!
Bitti.

Diğer taraftan “run()” metodu içerisinde yapılacak “Thread.sleep()” ve “wait()” çağrılarında (ve “InterruptedException” fırlatabileceğini belirten diğer metotların çağrılarında) söz konusu bayrağın durumu kontrol edilerek otomatik olarak “InterruptedException” fırlatılır. Bu gibi bir durumda “catch” bloğu içerisinde gerekli gördüğümüz işlemleri yapabiliriz.

Reklamlar

Bir Yorum 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