Yazılımda bounded-buffer problemi olarakda bilinen Producer Consumer problemi aslında bir multithread applicationlardaki synchronization problemine yönelik bir çözümdür. Birden fazla thread ortak bir nesneyi veya alanı kullanmaktadır. Aynı anda bu alana erişim yazılımımızda sorunlara neden olabilir. Bu nedenle ortak alanın aynı anda erişimini engellemek gereklidir.
Aşağıdaki örnekte Producer ortak alana değer yazan sınıfımızdır.
public class Producer extends Thread { private Hole cubbyhole; private int number; public Producer(Hole c, int number) { this.setPriority(Thread.MAX_PRIORITY); cubbyhole = c; this.number = number; } public void run() { for (int i = 0; i < 10; i++) { cubbyhole.put(i); System.out.println("Producer #"+number+":"+i); try { sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) { } } } }
Consumer ortak alandan değer okuyan sınıfımızdır.
public class Consumer extends Thread { private Hole cubbyhole; private int number; public Consumer(Hole c, int number) { cubbyhole = c; this.number = number; } public void run() { int value = 0; for (int i = 0; i < 10; i++) { value = cubbyhole.get(); System.out.println("Consumer #"+number+":"+value); } } }
Hole ise bizim ortak alanımızdır. Her iki thread’de bu nesneye ulaşabilmektedir.
public class Hole { private int contents; private boolean available = false; public synchronized int get() { while (available == false) { try { wait(); } catch (InterruptedException e) { } } available = false; notifyAll(); return contents; } public synchronized void put(int value) { while (available == true) { try { wait(); } catch (InterruptedException e) { } } contents = value; available = true; notifyAll(); } }
Bu sınıfı çalıştırabilmemiz için gerekli örnek main method.
public static void main(String[] args) { Hole hole = new Hole(); Producer producer = new Producer(hole, 1); Consumer consumer = new Consumer(hole, 2); consumer.start(); producer.start(); while(true); }
Bu programın çıktısı aşağıdaki gibi olacaktır.
Producer #1 : 0
Consumer #2:0
Producer #1 : 1
Consumer #2:1
Producer #1 : 2
Consumer #2:2
Producer #1 : 3
Consumer #2:3
Producer #1 : 4
Consumer #2:4
Producer #1 : 5
Consumer #2:5
Producer #1 : 6
Consumer #2:6
Producer #1 : 7
Consumer #2:7
Producer #1 : 8
Consumer #2:8
Producer #1 : 9
Consumer #2:9

Son Yorumlar