《数据结构与算法》之队列的应用+多线程(10)

当然,这个程序就是举个例子,而已,是一个比较经典的题目了,那么这个题是这样的,我们买票和卖票,那么要排队,但是排队的人不能超过十个,排队的同时我们也在卖票,但我们的票只有一百张,卖完为止。这个里面我们就用到了队列,然后加上我们的多线程。代码如下:
queue类:
package org.lixiyuan.duilie;

public interface Queue {
//入队
public void append(Object obj)throws Exception;
//出队
public Object delete()throws Exception;
//取对头元素
public Object getFront() throws Exception;
//判断是否为空
public boolean isEmpty();

}
cyclequeue类: 
package org.lixiyuan.duilie;

public class CycleQueue implements Queue {
public static final int defaultSize=10;
public int front;//对尾
public int rear;//队头
public int count;//计算有几个
public int maxSize;//最大个数
public Object[] queue;
public CycleQueue(){
init(defaultSize);
}
public CycleQueue(int size){
init(size);
}
public void init(int size){
front=rear=0;
count=0;
queue=new Object[size];
maxSize=size;
}

@Override
public void append(Object obj) throws Exception {
if(front==rear&&count>0){
throw new Exception("队列已满");
}
queue[front]=obj;
front=(front+1)%maxSize;
count++;
}

@Override
public Object delete() throws Exception {
if(isEmpty()){
throw new Exception("队列为空");
}
Object obj=queue[rear];
rear=(rear+1)%maxSize; 
count--;
return obj;
}

@Override
public Object getFront() throws Exception {
// TODO Auto-generated method stub
return queue[rear];
}

@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return count==0;
}

}
window类:
package org.lixiyuan.duilie;

public class Window {
public int maxSize=10;
public int num=0;//用来计算我卖了多少张票,那么我们一共就只有100张票
public CycleQueue queue=new CycleQueue(maxSize);
public boolean isActive=true;//用来决定是否继续卖票
public synchronized void producer() throws Exception{
if(queue.count<maxSize){
queue.append(num++);
System.out.println("第"+num+"个人等待排队");
this.notifyAll();
}else{
try {
System.out.println("队列已满");
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public synchronized void consumer() throws Exception{
if(queue.count>0){
Object obj=queue.delete();
int i=Integer.parseInt(obj+"");
System.out.println("第"+(i+1)+"个顾客拿着票走了");
if(this.num>=100&&queue.isEmpty()){
System.out.println("票卖完了");
isActive=false;
}
this.notifyAll();
}else{
try {
System.out.println("队列以空 请等待。。。。");
this.wait();
} catch (Exception e) {
// TODO: handle exception
}
}
}

}
consumer类:
package org.lixiyuan.duilie;

public class Consumer implements Runnable {
public Window window;
public Consumer(Window window){
this.window=window;
}
@Override
public void run() {
while(window.isActive){
try {
window.consumer();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}
producer类:
 package org.lixiyuan.duilie;

public class Producer implements Runnable {
public Window window;
public Producer(Window window){
this.window=window;
}
@Override
public void run() {
while(window.num<100){
try {
window.producer();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}
测试类:
package org.lixiyuan.duilie;

public class Test {

/**
 * @param args
 * @throws Exception 
 */
public static void main(String[] args) throws Exception {

Window window=new Window();
Producer producer=new Producer(window);
Consumer consumer=new Consumer(window);
Thread t1=new Thread(producer);
Thread t2=new Thread(consumer);
t2.start();
t1.start();
//
}

}

结果:
队列以空 请等待。。。。
第1个人等待排队
第2个人等待排队
第3个人等待排队
第4个人等待排队
第5个人等待排队
第6个人等待排队
第7个人等待排队
第8个人等待排队
第9个人等待排队
第10个人等待排队
队列已满
第1个顾客拿着票走了
第2个顾客拿着票走了
第3个顾客拿着票走了
第4个顾客拿着票走了
。。。。。。。。。。。。。。
 
第94个顾客拿着票走了
第95个顾客拿着票走了
第96个顾客拿着票走了
第97个顾客拿着票走了
第98个顾客拿着票走了
第99个顾客拿着票走了
第100个顾客拿着票走了
票卖完了

你可能感兴趣的:(《数据结构与算法》之队列的应用+多线程(10))