ReentrantLock, Condition Class, await, signal

Kategori: Java , 21 Temmuz 2019 , JanFranco


Daha önce senkronizasyon yöntemiyle yaptığımız işleri bu sefer manuel olarak yapacağız. Bunun için bir ReentrantLock, Condition sınıfından bir obje oluşturuyoruz. Condition sınıfı sayaesinde await ve signal methodlarını kullanabileceğiz. Bu methodlar wait, notify methodlarına oldukça benzemekte. Kod üzerinden görelim:


import java.util.Scanner;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
	
	private int count = 0;
	private Lock lock = new ReentrantLock();
	private Condition condition = lock.newCondition();
	
	public void count(){
		
		for(int i=1; i<=10000; i++){
			
			count++;
			
		}
		
	}

	public void thread1Fonksiyon(){
		
		lock.lock();
		
		System.out.println("Thread1 is working...");
		System.out.println("Thread1 is waiting to be awakened...");
		
		try {
			condition.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Thread 1 is awakened and continues his work...");
		count();
		
		lock.unlock();
		
		
	}
	
	public void thread2Fonksiyon(){
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		Scanner scanner = new Scanner(System.in);
		
		lock.lock();
		
		System.out.println("Thread2 is working...");
		count();
		System.out.println("Enter a char");
		scanner.nextLine();
		condition.signal();
		
		System.out.println("Thread2 woke Thread1 up.");
		
		lock.unlock();
		
	}
	
	public void threadOver(){
		
		System.out.println("Count: " + count);
		
	}
	
}
Burada yapılan işlemleri özetleyelim, Thread1Fonksiyonu çalıştığında lock.lock methodu ile fonksiyonu kilitledik. Yani başka bir process bu fonksiyona giremeyecek. Daha sonra await methodu ile işlemi yarıda kestik. Bunlar olurken aynı anda diğer fonksiyon da çalışıyor tabi ki. O fonksiyonda da lock.lock methodu ile başka bir processin o fonksiyonu çalıştırması engellendi. Thread2Fonksiyonu işini yaptı ve kullanıcıdan bir karakter bekledi. Karakter girildiğinde signal methodu ile Thread1Fonksiyonuna devam etmesini söyledi. Threadleri çalıştıralım, sonucu görelim:

public class Main_class {
	
	public static void main(String[] args){
		
		ReentrantLockExample rl = new ReentrantLockExample();
		
		Thread producer = new Thread(new Runnable() {
			
			@Override
			public void run() {
				rl.thread1Fonksiyon();
			}
		});
	
		Thread consumer = new Thread(new Runnable() {
			
			@Override
			public void run() {
				rl.thread2Fonksiyon();
			}
		});
		
		producer.start();
		consumer.start();
		
		try {
			producer.join();
			consumer.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		rl.threadOver();
		
	}
	
}

Thread1 is working...
Thread1 is waiting to be awakened...
Thread2 is working...
Enter a char
J
Thread2 woke Thread1 up.
Thread 1 is awakened and continues his work...
Count: 20000


Sonraki Yazı: DeadLock, tryLock
Yorumlar

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