实现一个由A、B、C三个窗口同时销售100张票的系统
1. 创建3个线程分别代表三个窗口(10分)
2. 三个窗口同时开始售票,要求打印出每个窗口打印的售票情况(10分)
3. 每个窗口不得连续售票。当剩余票为0时,线程停止运行(10分)
创建一个票类作为线程操作的资源
public class Ticket{
int tickets;
boolean flag = true;
// 传入需要卖的票的总票数
public Ticket(int tickets) {
this.tickets = tickets;
}
public synchronized void saleTick() throws Exception {
while(flag){
if(tickets > 0){
//每200毫秒卖一张票
Thread.sleep(200);
System.out.println(Thread.currentThread().getName()+
" 卖出了"+(tickets--)+"号票");
//在进入等待之前,先唤醒其他线程
this.notifyAll();
//卖完一张票后开始等待被唤醒
this.wait();
}else{
flag = false;
//结束循环前,唤醒所有在等待的线程
this.notifyAll();
}
}
}
}
创建销售线程:
public class SaleWin implements Runnable{
private Ticket ticket;
public SaleWin(Ticket ticket) {
this.ticket = ticket;
}
@Override
public void run() {
while(ticket.flag){
try {
ticket.saleTick();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
创建测试类:
public class Test {
public static void main(String[] args) {
Ticket ticket = new Ticket(100);
SaleWin sw = new SaleWin(ticket);
new Thread(sw,"窗口A").start();
new Thread(sw,"窗口B").start();
new Thread(sw,"窗口C").start();
}
}