multithreading - What is wrong with this implementation of Producer Consumer in java? -
i have implemented classic producer/consumer problem, using shared buffer class.
for reason not getting correct sequence of outputs.
i have tried many times, not spot flaw, can please point out mistake?
public class bufferprodcons { boolean produced = false; int data; public synchronized void producedata(int d) { while (produced) { try { wait(); } catch (interruptedexception ie) { ie.printstacktrace(); } } // system.out.println("data produced"); data = d; produced = true; this.notify(); } public synchronized int consumedata() { while (!produced) { try { wait(); } catch (interruptedexception ie) { ie.printstacktrace(); } } // system.out.println("data consumed"); int d =data; produced = false; this.notify(); return d; } } public class consumer extends thread { bufferprodcons buffer ; consumer(bufferprodcons buf){ buffer = buf; } public void run(){ (int =0;i<10;i++){ int d=buffer.consumedata(); system.out.println("consumed data "+d); try { thread.sleep(300); } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } } } } public class producer extends thread { bufferprodcons buffer; producer(bufferprodcons buf){ buffer = buf; } @override public void run(){ for(int i=0;i<10;i++){ system.out.println("produced "+i); buffer.producedata(i); try { thread.sleep(200); } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } } } } public class mainprodcons { public static void main(string[] args) { bufferprodcons buffer = new bufferprodcons(); thread t1 = new producer(buffer); thread t2 = new consumer(buffer); t1.start();t2.start(); } }
sample output
produced 0 consumed data 0 produced 1 consumed data 1 produced 2 produced 3 consumed data 2 produced 4 consumed data 3 produced 5 consumed data 4 produced 6 consumed data 5 produced 7 consumed data 6 produced 8 consumed data 7 produced 9 consumed data 8 consumed data 9
my understanding , sequence of producer , consumer lines should alternate, can see appear in succession.
Comments
Post a Comment