Ticker

6/random/ticker-posts

Java'da Timer ve TimerTask Kullanımı

Asenkron olarak bir işi belirteceğimiz süre kadar sonra çalıştırmak istediğimizde java.util.Timer ve java.util.TimerTask sınıflarını kullanabiliriz.

Java'da Timer ve TimerTask kullanımı
Java'da Timer ve TimerTask kullanımı

java.util.TimerTask sınıfı java.lang.Runnable sınıfını gerçekler ve bir run() metodunu implement etmemizi bekler. Tanımladığımız Timer nesnesine değişik yetenekteki schedule metodları ile TimerTask nesnesini veririz. Aşağıda örnek kullanımı inceleyebiliriz.

import java.util.Timer;
import java.util.TimerTask;

public class JavaTimerTutorial {
	
	public static void main(String[] args) {
		
		Timer timer = new Timer("SmartyCoder Timer");
		
		TimerTask fiveSecondsLater = new TimerTask() {
			
			@Override
			public void run() {
		
				System.out.println("5 SECONDS PASSED");
				//timer.cancel();
			}
		};
		

		timer.schedule(fiveSecondsLater, 5000);
	
		TimerTask periodicTask = new TimerTask() {
			
			@Override
			public void run() {

				System.out.println("Periodic task executed");
				
			}
		};
		
		timer.scheduleAtFixedRate(periodicTask, 1000, 1000);
		
		System.out.println("main thread");
		
	}
	
}

java.util.Timer.schedule(TimerTask task, long delay) metodu ile, delay miktarı milisaniye sonra task parametresini çalıştırmasını istediğimizi belirtmiş oluyoruz.

java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period) metodu ile, task ile tanımladığımız işi ilk çalıştırma delay miktarı milisaniye olmak üzere, daha sonra her period miktarı milisayinede bir periyodik olarak tekrar çalıştırmak istediğimizi belirtmiş oluyoruz.

Örnek kodumuzu çalıştırdığımızda çıktımız şu şekilde olacaktır. Herhangi bir noktada timer.cancel()  çağırmadığımız için program sürekli "Periodic task executed" basmaya devam edecektir.

>Program Çıktısı:

main thread
Periodic task executed
Periodic task executed
Periodic task executed
Periodic task executed
Periodic task executed
5 SECONDS PASSED
Periodic task executed
Periodic task executed
Periodic task executed
Periodic task executed

Örnek kodumuzdaki gibi Timer tanımladığımızda Timer'a bağlı olan thread deamon özelliğinde olmamaktadır. Yani, main thread bittiğinde otomatik olarak sonlanmamakta ve programın çalışmasına devam etmesine sebep olmaktadır. Aşağıdaki kodu debug'da çalıştıralım ve Eclipse IDE'mizin Debug tabında Thread'leri inceleyelim.

import java.util.Timer;
import java.util.TimerTask;

public class JavaTimerTutorial {
	
	public static void main(String[] args) {
		
		Timer timer = new Timer("SmartyCoder Timer");
		
		TimerTask fiveSecondsLater = new TimerTask() {
			
			@Override
			public void run() {
		
				System.out.println("5 SECONDS PASSED");
				//timer.cancel();
			}
		};

		timer.schedule(fiveSecondsLater, 5000);
 
		System.out.println("main thread");
		
	}
	
}


Java Deamon Timer
Java Deamon Timer

Task 5 saniye sonrasında ayarlanıyor. Programı çalıştırıyoruz. 5 saniye sonra task çalışıyor fakat program sonlanmıyor. Çünkü Debug tabında gördüğümüz gibi tanımladığımız Timer canlı kalmaya devam ediyor. Bu sorunu TimerTask run() metodu içindeki timer.cancel(); satırını yorumdan çıkararak çözebiliriz. Program 5 saniye sonra artık sonlanabilecektir.


Yorum Gönder

0 Yorumlar