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();
	}
}

  

三、运行结果

四、小结

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

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

原文地址:https://www.cnblogs.com/shamgod/p/4607093.html