您的位置:首页 > 编程语言 > Java开发

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

2015-11-21 00:00 489 查看
摘要: 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()+"线程等待时被中断");
}
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息