İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

Timer'lar

Thread'ler Ve Timer'lar

Timer class'ı bir işlemi belli bir süre sonra bir kere veya belli aralıklarla yapmak için kullanılır. Elbette bu thread kullanarak yapılabilir. Thread.sleep methodunu kullanarak belli bir sure beklemek ve belli bir islemi yapmaktan ibarettir. Ancak Timer'lar cok daha basit kullanıma sahiptirler. Zaten Timer'da icerisinde bir thread kullanır. Timer class'ına bir task (iş)verilir ve belli bir zaman sonra yapması istenir. Bir işlemi 500 milisaniye sonra başlayıp 1000 milisaniye aralıklarla yapan bir ornek yapalım.

TimerTest.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 package com.godoro.samples.lang;
  2 import java.util.*;
  3 public class TimerTest {
  4   
  5   public static void main(String[] args){
  6     TimerTask task=new TimerTask(){
  7       public void run(){
  8   System.out.println("Task time : "+new Date());      
  9       }
 10     };
 11     Timer timer=new Timer();
 12     timer.schedule(task,500, 1000);
 13     
 14   }  
 15 }

Burada TimerTask class'ı extend edilerek run() methodu imlement edilmektedir ve Timer'ın schedule methodu'na verilmektedir.

Sabit Aralıklı (Fixed-Interval) ve Sabit Oranlı (Fixed-Rate) Çalıştırma

Timer class'ının schedule methodu işlemi yapıp sabir bir sure bekler ve tekrar yapar. Buna sabit aralıklı (fixed-interval) çalıştırma denir. Yapılan işlemin ne kadar süreceğine bağlı olarak her adım farklı zamanlarda yapılır. Bazı durumlarda sabit aralıklı değil sabir oranlı (fixed-rate) çalıştırma istenebilir. Yani işlem nakadar uzun sürerse sürsün bir sonraki adım aynı zamanda yapılır. Daha doğrusu yapılmaya çalışılır. Çünkü bazı durumlarda işlem belirtilen aralıktan daha uzun sürer, bu durumda bir sonraki adım zamanında yapılmaz. Bu durumda Timer class'ı kaybedilen zamanı telefi etmek için sonraki adımları peş peşe yaparak sabit oranı yakalamaya çalışır. Sabir oranlı çalıştırma sağlayan method shceduleFixedRate() dir.

Konuyu biraz daha raha anlaşılır hale getirmek için örnek verelim. Aşağıda sabir aralıklı ve sabir oranlı çalıştırma için bir işlemin çalıştırılma zamanları gösterilmektedir. Tİmer 500 ms sonra başlıyor ve işlem ortalam olarak 200 ms sürüyor. Bekleme aralığı da 1000 olsun.

Sabit Aralıklı
BaşlamaBitiş
1. Adım500700
2. Adım17001900
3. Adım29003100
Sabit Oranlı
BaşlamaBitiş
4. Adım500700
5. Adım15001700
6. Adım25002700

Gürüldüğü gibi sabir oranlı çalıştırmada adımlara 500,1500,2500 şeklinde gidiyor. 1. Adım kazayla 200 değilde 1200 saniye sürseydi. Başlama 500, 1700,2500 olarak gidecekti. 1700'de sapma yaşansa da 2500'de normak halinde dönecekti.

java.util.Timer ve javax.swing.Timer

Java Utilites paketi (java.util)'da bir Timer class'ı olduğu gibi Java Swing paketi (javax.swing)'de de bir Timer class'I bulunmaktadır. Aslında swing'deki timer daha once Java'ya gelmiştir. İkisi temelde aynı işlevi görür. java.util.Timer daha gelişmiş özelliklere sahiptir ancak javax.swing.Timer arayüzlerde kullanmak için dah uygundur. Swing'deki Timer'ın iki farkı vardır. Birincisi TimerTask yerine arayüzde event'leri dinlemek için kullanılan ActionListener interface'ini alır. İkinci özellik Utility'deki her Timer bir Thread kullanırken, Swing'deki bütün Timer'lar aynı Thread'i kullanır. Yani tek bir thread bütün Timer'ların işlemlerini sırayla vakit buldukça yapar.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır