生产者生产面包,消费者消费面包,当生产者生产到MAX个时,等待消费者消费,消费者没面包消费时,等待生产者生产,只有有面包,消费者就希望消费,但消费者食量有限,等到消费者消费到25个面包时,就不消费了,生产者生产到MAX个面包后,也停止了劳动!
- package jk2;
- import java.util.LinkedList;
- import java.util.Queue;
- public class SynThreadTest {
- /**
- * @param args
- * @author jake20001@126.com
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int MAX=10;
- Queue<Object> q = new LinkedList<Object>();
- Producer p = new Producer(q,MAX);
- Consumer c = new Consumer(q,p);
- p.start();
- c.start();
- }
- }
- class Producer extends Thread {
- Queue<Object> q ;
- int total;
- int i = 0;
- Producer(Queue<Object> q,int total){
- this.q = q;
- this.total = total;
- }
- public void run(){
- while(true){
- synchronized(q){
- while(q.size()==total){
- System.out.println("Producer is full!");
- try {
- q.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- i++;
- Object b = new Bread(i);
- if(q.add(b)){
- System.out.println("Producer is processing! " + b.toString());
- q.notify();
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- }
- class Consumer extends Thread {
- Queue<Object> q;
- Producer pr;
- Consumer(Queue<Object> q,Producer pr){
- this.q = q;
- this.pr = pr;
- }
- public void run(){
- while(true){
- synchronized(q){
- while(q.size()==0){
- System.out.println("Consumer is waiting for products! ");
- try {
- q.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- if(q.size()>0){
- /*System.out.println("================" + pr.i);
- if(pr.i >= 25){
- System.out.println("You eat too much!Stop!");
- return;
- }*/
- Object rb= q.remove();
- System.out.println("Consumer is consuming products! " + rb.toString());
- if(((Bread) rb).getNumber()==25){
- System.out.println("精确控制到消费者的消费量,然后生产者生产到规定的最大量就等待!");
- System.out.println("You eat too much!Stop!");
- return;
- }
- q.notify();
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- }
- class Bread{
- int number;
- public Bread(int n) {
- number = n;
- }
- public int getNumber() {
- return number;
- }
- public void setNumber(int number) {
- this.number = number;
- }
- public String toString(){
- return "第 " + number + " 个 面包!";
- }
- }
输出:
Producer is processing! 第 1 个 面包!
Consumer is consuming products! 第 1 个 面包!
Consumer is waiting for products!
Producer is processing! 第 2 个 面包!
Producer is processing! 第 3 个 面包!
Producer is processing! 第 4 个 面包!
Producer is processing! 第 5 个 面包!
Producer is processing! 第 6 个 面包!
Producer is processing! 第 7 个 面包!
Producer is processing! 第 8 个 面包!
Consumer is consuming products! 第 2 个 面包!
Consumer is consuming products! 第 3 个 面包!
Consumer is consuming products! 第 4 个 面包!
Consumer is consuming products! 第 5 个 面包!
Producer is processing! 第 9 个 面包!
Producer is processing! 第 10 个 面包!
Producer is processing! 第 11 个 面包!
Producer is processing! 第 12 个 面包!
Producer is processing! 第 13 个 面包!
Producer is processing! 第 14 个 面包!
Producer is processing! 第 15 个 面包!
Producer is full!
Consumer is consuming products! 第 6 个 面包!
Consumer is consuming products! 第 7 个 面包!
Consumer is consuming products! 第 8 个 面包!
Producer is processing! 第 16 个 面包!
Producer is processing! 第 17 个 面包!
Consumer is consuming products! 第 9 个 面包!
Consumer is consuming products! 第 10 个 面包!
Consumer is consuming products! 第 11 个 面包!
Consumer is consuming products! 第 12 个 面包!
Consumer is consuming products! 第 13 个 面包!
Consumer is consuming products! 第 14 个 面包!
Consumer is consuming products! 第 15 个 面包!
Consumer is consuming products! 第 16 个 面包!
Producer is processing! 第 18 个 面包!
Producer is processing! 第 19 个 面包!
Consumer is consuming products! 第 17 个 面包!
Producer is processing! 第 20 个 面包!
Consumer is consuming products! 第 18 个 面包!
Consumer is consuming products! 第 19 个 面包!
Consumer is consuming products! 第 20 个 面包!
Consumer is waiting for products!
Producer is processing! 第 21 个 面包!
Producer is processing! 第 22 个 面包!
Producer is processing! 第 23 个 面包!
Producer is processing! 第 24 个 面包!
Producer is processing! 第 25 个 面包!
Producer is processing! 第 26 个 面包!
Producer is processing! 第 27 个 面包!
Producer is processing! 第 28 个 面包!
Producer is processing! 第 29 个 面包!
Producer is processing! 第 30 个 面包!
Producer is full!
Consumer is consuming products! 第 21 个 面包!
Consumer is consuming products! 第 22 个 面包!
Consumer is consuming products! 第 23 个 面包!
Consumer is consuming products! 第 24 个 面包!
Consumer is consuming products! 第 25 个 面包!
精确控制到消费者的消费量,然后生产者生产到规定的最大量就等待!
You eat too much!Stop!
Producer is processing! 第 31 个 面包!
Producer is processing! 第 32 个 面包!
Producer is processing! 第 33 个 面包!
Producer is processing! 第 34 个 面包!
Producer is processing! 第 35 个 面包!
Producer is full!