Java-J2SE学习笔记-线程-生产者消费者问题

一、概述

模拟生产者消费者问题

 

二、代码

1.Consumer.java

2.Producer.java

3.SyncStack.java

4.Test.java

 

1.Consumer.java

package ProducerConsumer;



public class Consumer implements Runnable {



	private SyncStack syncStack;

	

	

	public Consumer(SyncStack syncStack) {

		super();

		this.syncStack = syncStack;

	}



	public  void consume(){

		Product p; 

		for(int i = 0 ; i < 10 ; i++){

			p = syncStack.pop();

			System.out.println("******消费了:"+p);

		}

	}



	@Override

	public void run() {

//		try {

//			Thread.sleep(10);

//		} catch (InterruptedException e) {

//			e.printStackTrace();

//		}

		consume();

	}

}

  

2.Producer.java

package ProducerConsumer;



public class Producer implements Runnable {

	

	private SyncStack syncStack;

	

	public Producer(SyncStack syncStack) {

		super();

		this.syncStack = syncStack;

	}



	public  void produce(){

		for(int i = 0 ; i < 10 ; i++){

			Product p = new Product(i);

			syncStack.push(p);

			System.out.println("生产了:"+p);

		}

	}



	@Override

	public void run() {

		produce();

	}

}

  

3.SyncStack.java

package ProducerConsumer;



import java.util.ArrayList;

import java.util.List;



public class SyncStack {



	int index = 0;

	Product [] ps = new Product[6];

	//List<Product> ps = new ArrayList<Product>(); 

	

	public synchronized void  push(Product p) {

		//if(index == ps.length){ //不能用if判断,若用if,则this.wait()出现异常时,代码仍会往下执行

		while(index == ps.length){

			try {

				this.wait();

			} catch (InterruptedException e) {

				e.printStackTrace();

			}

		}

		this.notifyAll();

		ps[index] = p;

		index = index + 1;

		//System.out.println(index);

	}

	

	public synchronized Product  pop() {

		while(index == 0){

			try {

				this.wait();

			} catch (InterruptedException e) {

				e.printStackTrace();

			}

		}

		this.notifyAll();

		index --;

		return ps[index];

//		System.out.println("ps===="+ps);

//		Product p = ps.get(ps.size()-1);

//		ps.remove(ps.size()-1);

//		return p;

		

	}

}

  

4.Test.java

package ProducerConsumer;



public class Test {



	public static void main(String[] args) {

		SyncStack ss = new SyncStack();

		

		Producer p1 = new Producer(ss);

		Consumer c1 = new Consumer(ss);

		

		Thread tp1 = new Thread(p1); 

		Thread tc1 = new Thread(c1); 

		

		tc1.start();

		tp1.start();

		new Thread(new Producer(ss)).start();

		new Thread(new Consumer(ss)).start();

	}

}

  

三、运行结果

Java-J2SE学习笔记-线程-生产者消费者问题

四、小结

1.this.wait(),保有先锁定,才能调用wait,wait是使正在访问本对象的线程wait,且wait后此线程的锁会丢失,只有当线程醒来后才会再去找回锁。sleep则锁不会丢失。

2.this.notify()唤醒一个正在wait当前对象上的一个线程

你可能感兴趣的:(生产者消费者)