《java多线程设计模式 第五章Producer Consumer》





/*************************************************************************************************************************************************************************************/

Table类:

public class Table
{
	private final String[] buffer;
	private int tail;//下一个put的地方
	private int head;//下一个take的地方
	private int count;//buffer内的蛋糕数量
	
	public Table(int count)
	{
		this.buffer = new String[count];
		this.head = 0;
		this.tail = 0;
		this.count = 0;
	}
	
	public synchronized void put(String cake) throws InterruptedException
	{
		System.out.println(Thread.currentThread().getName()+"puts "+cake);
		while(count >= buffer.length)
		{
			System.out.println(Thread.currentThread().getName()+"wait() begin "+cake);
			wait();
			System.out.println(Thread.currentThread().getName()+"wait() end "+cake);
		}
		
		buffer[tail] = cake;
		tail = (tail + 1) % buffer.length;
		count++;
		notifyAll();
	}
	
	public synchronized String take() throws InterruptedException
	{
		while(count <= 0)
		{
			wait();
		}
		String cake = buffer[head];
		head = (head + 1)%buffer.length;
		count--;
		notifyAll();
		System.out.println(Thread.currentThread().getName()+"takes "+cake);
		return cake;
	}
}
/*************************************************************************************************************************************************************************************/
public class MakeThread extends Thread
{
	private final Random random;
	private final Table table;
	private static int id = 0;// 蛋糕流水号

	public MakeThread(String name, Table table, long seed)
	{
		super(name);
		this.table = table;
		this.random = new Random(seed);
	}

	public void run()
	{
		try
		{
			while (true)
			{
				Thread.sleep(random.nextInt(1000));
				String cake = "[Cake No. " + nextId() + " by " + getName() + "]";
				table.put(cake);
			}
		}
		catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private static synchronized int nextId()
	{
		return id++;
	}
}
/*************************************************************************************************************************************************************************************/

import java.util.Random;


public class EaterThread extends Thread
{
	private final Random random;
	private final Table table;
	public EaterThread(String name,Table table,long seed)
	{
		super(name);
		this.table = table;
		this.random = new Random(seed);
	}
	
	public void run()
	{
		try
        {
	        while(true)
	        {
	        	String cake = table.take();
	        	Thread.sleep(random.nextInt(1000));
	        }
        }
        catch (InterruptedException e)
        {
	        // TODO: handle exception
        }
	}
	
	
}

/*************************************************************************************************************************************************************************************/


public class Main
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		Table table = new Table(3);
		new MakeThread("makerthread 1 ", table, 31415).start();
		new MakeThread("makerthread 2 ", table, 31415).start();
		new MakeThread("makerthread 3 ", table, 31415).start();
		
		new EaterThread("eaterthread 1 ", table, 32568).start();
		new EaterThread("eaterthread 2 ", table, 32568).start();
		new EaterThread("eaterthread 3 ", table, 32568).start();
		
	}

}

类图结构。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值