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.
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şlama
Bitiş
1. Adım
500
700
2. Adım
1700
1900
3. Adım
2900
3100
Sabit Oranlı
Başlama
Bitiş
4. Adım
500
700
5. Adım
1500
1700
6. Adım
2500
2700
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.