java多线程——生产者消费者问题

package com.fsun.research.thread.producercustomer;

import java.util.Stack;

public class MainTest {
	public static void main(String[] args) {
		//多线程生产者消费者模式   :生产票和买票
		Stack<Ticket> stack=new Stack<Ticket>();
		Thread thread1=new Thread(new TicketProducer(stack, "生产票"));
		Thread thread2=new Thread(new TicketCustomer(stack, "消费票"));
		thread1.start();
		thread2.start();
	}
}

Ticket:

package com.fsun.research.thread.producercustomer;

import java.util.Date;

public class Ticket {
	private int cost;  //价格
	private Date date;  //生产时间
	public Ticket(int cost, Date date) {
		super();
		this.cost = cost;
		this.date = date;
	}
	public int getCost() {
		return cost;
	}
	public void setCost(int cost) {
		this.cost = cost;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
}

TicketCustomer:

package com.fsun.research.thread.producercustomer;

import java.util.Stack;

//消费票
public class TicketCustomer implements Runnable{
	private Stack<Ticket> ticketPool;
	private String displayName;
	public TicketCustomer(Stack<Ticket> ticketPool,String displayName){
		this.ticketPool=ticketPool;
		this.displayName=displayName;
	}
	@Override
	public void run() {
		Ticket ticket=null;
		while(true){
			synchronized (ticketPool) {
				if(ticketPool.isEmpty()){
					ticketPool.notify();
					//票池里没票
					try {
						ticketPool.wait();    //释放锁
					} catch (InterruptedException e) {
					}
				}else{
					ticket=ticketPool.pop();
					System.out.println(displayName+"线程从票池中取出票");
				}				
			}
		}
	}	
}

TicketProducer:

package com.fsun.research.thread.producercustomer;

import java.util.Date;
import java.util.Stack;

//生产票
public class TicketProducer implements Runnable{
	private String displayName;
	private Stack<Ticket> ticketPool;
	public TicketProducer(Stack<Ticket> ticketPool,String displayName){
		this.ticketPool=ticketPool;
		this.displayName=displayName;
	}
	@Override
	public void run() {
		while(true){
			synchronized (ticketPool) {
				if(ticketPool.isEmpty()){
					Ticket ticket=new Ticket(20, new Date());
					ticketPool.push(ticket);
					System.out.println(displayName+"线程往票池中插入一张票");
					ticketPool.notify();
				}else{
					try {
						ticketPool.wait();
					} catch (InterruptedException e) {
						System.out.println(Thread.currentThread().getName()+"线程等待时被中断");
					}
				}				
			}
		}		
	}
}


你可能感兴趣的:(java多线程,生产者消费者问题)