JAVA 生产者和消费者模型
定义车站售票,加入一张车票,才能卖出一张车票。涉及到加锁同步的操作。这里新建一个类继承Thread,有两个加锁的方法。通过新建2个新类分别取调用这个方法。获得一个带锁的方法,该类的其它带锁的方法同时也会被锁住。
1.管理票的类
class Tickets extends Thread{
int Num;
boolean enable=ture;//加入enable可以确定sell优先
Tickets(int Num){//可以初始化票数
this.Num=Num;
}
public synchronized void put(){
if (enable){//如果可以卖票有效,进入等待,等待通知
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Num=Num+1;//收到通知后,开始加票
enable=true;//标记可以卖了
System.out.println("票数增加一张到:"+Num);
notify();//通知卖票的,可以开始卖票
}
public synchronized void sell(){
if (!enable){//如果还不能卖票,进入等待,等待通知
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Num=Num-1;//收到通知后,开始卖票
enable=false;//标记需要加票了
System.out.println("票数减少一张到:"+Num);
notify();//通知加票
}
}
2.负责卖票的类
class Sell extends Thread{
Tickets tickets;
Sell(Tickets tickets){//传入票对象
super("Sell");
this.tickets=tickets;
}
public void run(){//启动卖票
while (true){
tickets.sell();}
}
}
3.负责加票的类
class Put extends Thread{
Tickets tickets;
Put(Tickets tickets){//传入票对象
super("Put");
this.tickets=tickets;
}
public void run(){//启动加票
while (true) {
tickets.put();
}
}
}
4.测试
public class JavaTest {
public static void main(String arg[]){
Tickets station=new Tickets(1);//初始票数
//因为定义了优先卖票,以下线程启动先后无关
new Put(station).start();
new Sell(station).start();
}
}
运行结果
票数减少一张到:0
票数增加一张到:1
票数减少一张到:0
票数增加一张到:1
票数减少一张到:0
票数增加一张到:1
票数减少一张到:0
票数增加一张到:1
票数减少一张到:0
票数增加一张到:1
票数减少一张到:0
票数增加一张到:1