wait, notify

Kategori: Java , 21 Temmuz 2019 , JanFranco


Eş zamanlı tasklarımızı, işlemlerimizi wait, notify methodları ile manipüle edebiliriz. Bu methodlar birbilerine bağlı methodlardır, lock değişimlerini sağlarlar. Örneğin bir fonksiyon çalıştırıp, işlemlerin tam ortasına wait methodunu yerleştirirsek, fonksiyon o methodu gördüğünde çalışmasını durdurur. Lock bir başka fonksiyona geçer. O fonksiyon çalışmaya devam eder. Eğer o fonksiyonda notify methodunu kullanırsak, lock tekrar önceki fonksiyona döner ve işlem kaldığı yerden devam eder. notfiy methodunu kullanmazsak ilk fonksiyon sonsuza kadar bekler, program sonlanamaz. Bu anlattıklarımı kod üzerinden görelim:


import java.util.Scanner;

public class WaitNotify {
	
	private Object lock = new Object();
	
	public void func1(){
		
		synchronized (lock) {
			System.out.println("Thread1 is running...");
			System.out.println("Thread1 is sleeping...");
			
			try {
				lock.wait();
			} catch (InterruptedException e) {
				System.out.println("Interrupted.");
			}
			
			System.out.println("Thread1 is running again...");
		}
		
	}
	
	public void func2(){
		
		Scanner scanner = new Scanner(System.in);
		
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			System.out.println("Interrupted.");
		}
		
		synchronized (lock) {
			System.out.println("Thread2 is running...");
			System.out.println("Press a key.");
			scanner.nextLine();
			
			lock.notify();
			
			System.out.println("Thread 2 is sleeping...");
		}
		
	}
	
}
wait ve notify methodlarının çalışması için ortada lock gerektirecek durumlar olmalıdır. Bunu sağlamak için senkronizasyon yöntemini kullandık. İkinci fonksiyonu başta 2 saniye bekletmemizin sebebi ilk olarak ilk fonksiyonun çalışması içindir. İki thread oluşturup, sonucu görelim:

public class Main_class {
	
	public static void main(String[] args){
		
		WaitNotify wn = new WaitNotify();
		
		Thread producer = new Thread(new Runnable() {
			
			@Override
			public void run() {
				wn.func1();
			}
		});
	
		Thread consumer = new Thread(new Runnable() {
			
			@Override
			public void run() {
				wn.func2();
			}
		});
		
		producer.start();
		consumer.start();
		
		try {
			producer.join();
			consumer.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}
Sonuç:

Thread1 is running...
Thread1 is sleeping...
Thread2 is running...
Press a key.
J
Thread 2 is sleeping...
Thread1 is running again...


Sonraki Yazı: ProducerConsumer with wait, notify
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın