不带生产者和消费者之间的通信:
1 2 class SynchronizedMethods{ 3 int d; 4 synchronized void getDate() { 5 System.out.println("Got data:"+d); 6 } 7 synchronized void putdata(int d) { 8 this.d=d; 9 System.out.println("Put data:"+d);10 }11 }12 class Producer extends Thread{13 SynchronizedMethods t;14 public Producer (SynchronizedMethods t) {15 this.t=t;16 }17 public void run() {18 int data=700;19 while(true ) {20 System.out.println("Put called by producer");21 t.putdata(data++);22 }23 }24 25 }26 class Consumer extends Thread {27 SynchronizedMethods t;28 public Consumer(SynchronizedMethods t) {29 this.t=t;30 }31 public void run() {32 while(true) {33 System.out.println("Get called by consumer");34 t.getDate();35 }36 }37 }38 public class ProducerConsumer {39 public static void main(String args[]) {40 SynchronizedMethods obj1=new SynchronizedMethods();41 Producer p=new Producer(obj1);42 Producer c=new Producer(obj1);43 p.start();44 c.start();45 }46 }
无限循环
测试结果:
带有生产者和消费真之间的通信:
1 class SynchronizedMethods{ 2 int d ; 3 boolean flag=false ;//有无数据,初值为无数据 4 //由消费者调用 5 synchronized int getData() { 6 if(!flag) { //无数据情况下 7 try { 8 wait();//消费者等待 9 }10 catch(InterruptedException e) {11 System.out.println("Exception caught");12 }13 }14 System.out.println("Got data:"+d);15 flag =false ;16 notify();17 return d;18 }19 20 //生产者21 synchronized void putData(int d) {22 if(flag) { //you 数据情况下23 try {24 wait();//生产者等待25 }26 catch(InterruptedException e) {27 System.out.println("Exception caught");28 }29 }30 this.d=d;//成员变量的值赋值为d31 flag =true;32 System.out.println("put data:"+d);33 notify();//唤醒消费者34 }35 }36 37 class Producer implements Runnable { 38 SynchronizedMethods t;39 public Producer (SynchronizedMethods t) {40 this.t=t;41 new Thread (this ,"Producer").start();42 System.out.println("Put calledby producer");43 }44 public void run() {45 int data =0;46 while(true) {47 data=data+1;48 t.putData(data);49 }50 }51 }52 53 class Consumer implements Runnable { 54 SynchronizedMethods t;55 public Consumer(SynchronizedMethods t) {56 this.t=t;57 new Thread (this ,"Consumer").start();58 System.out.println("Put calledby producer");59 }60 public void run() {61 62 while(true) {63 t.getData();64 }65 }66 67 }68 69 public class InterThreadComm{70 public static void main(String args[]) {71 SynchronizedMethods obj1=new SynchronizedMethods();72 Producer p=new Producer(obj1);73 Consumer c=new Consumer(obj1);74 }75 }
测试结果: