-- Java SE

Thread Class

Thread sınıfı thread oluşturabilmek için gerekli constructorları ve threadları kontrol edebilmek için gerekli metodları içerir.

Thread sınıfı Runnable interfacesini implement ettiği için,Thread sınıfı extend eden bir sınıf oluşturulup run metodu burada implement edilebilir ve bu sınıftan bir nesne oluşturulup start metoduna başvurulabilir.Ancak bu önerilen bir tasarım değildir.

yield() metodu bir threadın diğer threadlara geçici olarak yerini bırakmasını sağlamak için kullanılır.Misal aşağıdaki gibi bir printNum sınıfına ait run() metodu oluşturulduğunda her numara yazdırıldıktan sonra print100 taskına ait thread diğer threadların çalışabilmesi için yerini geçici olarak yerini bırakır.

    public void run() {
        try {
            for (int i = 1; i <= lastNum; i++) {
                System.out.print(" " + i);
                if (i >= 50) Thread.sleep(1);
            }
        }
        catch (InterruptedException ex) {
        }
    }

sleep(long millis) metodu bir threadı belirtilen süre kadar uykuya yatırır ve diğer threadların çalıştırılması için süre tanır.Aşağıdaki gibi bur run() metodu implement edildiğinde,50 den büyük ve eşit her sayı yazdırıldığında print100 taskına ait tread 1 milisaniyelik uykuya yatar.

 public void run() {
        try {
            for (int i = 1; i <= lastNum; i++) {
                System.out.print(" " + i);
                if (i >= 50) Thread.sleep(1);
            }
        }
        catch (InterruptedException ex) {
        }
    }

sleep() metodu InterruptedException fırlatabilir.Bu exception uyuyan bir thread’ın interrupt() metodu çağırıldığında gerçekleşir. interrupt() metodu bir threadda çok nadiren çağırılır, bu yüzden InterruptedException da çok nadiren karşılaşılır. Ancak kontrol etmekte fayda olduğu için bir try-catch bloğu koymak gerekir. Eğer sleep() metodu bir loop içerisinde çağılıyorsa, loopu bir try-cacth bloğuna konulması gerekir.(Şekil a) Eğer loop bir try-catch bloğunun dışındaysa(Şekil b) threadda intterrupt() metodu çağırılmış olsa bile çalışmaya devam edebilir(interrupt() metodu,threadı yarıda kesmeye yarar)

join() metodu bir thread başladıktan sonra diğer bir threadı çalıştırmak için kullanılır.Sonradan akışa dahil edilen thread görevini tamamladıktan sonra,ilk thread çalışmaya devam eder.

Yukarda yeni thread4 oluşturuluyor ve bu thread ‘c’ karakterini 40 defa yazdırıyor. 50’den 100 e kadar olan numaralar ise thread4 işlemini bitirdikten sonra yazdırılır.

Javada tüm threadlar için bir öncelik(priority) vardır.Bu öncelik setPriority metoduyla artırabilir veya azaltılabilir. getPriority metoduyla ise getirilebilir. Priority’ler 1’den 10’a kadar numaralandırılmıştır. Thread sınıfı int MIN_PRIORITY(1), NORM_PRIORITY(5) ve MAX_PRIORITY(10) sabitlerine sahiptir. Main threadının priority değeri Thread.NORM_PRIORTY’dir.

JVM her zaman çalıştırmak için yüksek öncelikli threadı seçer. Düşük öncelikli bir thread sadece çalışabilecek yüksek öncelikli bir thread yoksa çalıştırılır. Eğer tüm çalıştırılabilir threadlar eşit önceliğe sahipse tüm threadlara eşit CPU zamanı ayrılır(round-robin scheduling kuralı). Örneğin thread3.setPriority(Thread.MAX_PRIORITY); kodunu eklediğimizde print100 taskı için oluşturulan thread önce biter.

Yorum bırak

Yorum