java生产者和消费者问题之售票实现方法

/** * 代码注释很详细: * 生产者与消费者的问题产生于共用一个对象,在一个时刻对象只能供两者之间的一个调用(加锁) * 通过判断通过设置的判断量来进行程序的控制。 * */ public class TestThread { public static void main(String[] args) { Tickets t = new Tickets(10); //创建一个对象,让其有10张票 new Producer(t).start();//启动生产票的线程 new Consumer(t).start();//启动售票的线程 } } //创建一个Tickets类,实例化一个对象,供生产者和消费者共用 class Tickets { int size; int number = 0; boolean available = false;//设置判断量,为true时售票,为false时生产票 public Tickets(int size) { this.size = size; } /*如果available为true时本线程等待,执行售票线程,售票线程启动后,当剩余的票数不够卖时重置available * 的值为false,于是返回当前的这个生产票的方法,并且重置available的值为true,这时再次唤醒售票线程 * 于是两个方法跟谁判断变量的值交替执行,判断available的值,wait,生产或者销售,重置available的值, * 销售线程或者生产线程。可能会有人认为方法加锁了啊 ,怎么能交替执行呢?其实加锁的意义在于对值的更改, * 如果一个方法对一个值加了锁,但是呢,另一个线程并没有改变该加锁方法中便;量的值,所以,这是可以实现的 * 如同程序中的number变量,在put()方法中加锁了,然后判断available的值就跳到了sell()方法中,sell方法没有改变 * number的值,只是读取sell的值。 * */ public synchronized void put() { if(available) try {wait();} catch(Exception e){} System.out.println("Producer puts tickets"+(++number)); available = true; notify(); } public synchronized void sell() { if(!available) try {wait();} catch(Exception e){} System.out.println("Consumer buys tickets"+(number)); available = false; notify(); if(number == size)//售完最后一张票后,设置一个结束的标志 number = size+1;//number>size,售票结束 } } class Producer extends Thread { Tickets t = null; public Producer(Tickets t){ this.t = t; } public void run() { while (t.number

你可能感兴趣的:(java,java,exception,class,thread,string)