/*
* 编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。
* 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程
*/
public class TicketSealCenter {
/*
* 售票中心 分配售票窗口 和总票数
*/
public static void main(String[] args) {
Ticket ticket = new Ticket(100);//初始化票数
/*
* 4个售票窗口
*/
SealWindow sw = new SealWindow("售票窗口1",ticket);
SealWindow sw1 = new SealWindow("售票窗口2",ticket);
SealWindow sw2 = new SealWindow("售票窗口3",ticket);
SealWindow sw3 = new SealWindow("售票窗口4",ticket);
new Thread(sw).start();
new Thread(sw1).start();
new Thread(sw2).start();
new Thread(sw3).start();
}
}
class SealWindow implements Runnable{
/*
* 买票,线程开启后 这里开始做事,那么这里就必须要实现RUNNERBLE接口
*/
private String selwindowname;
private Ticket ticket;
private boolean flag=true;
/*
* 初始化窗口 给了票的数量 以及 窗口名字
*/
public SealWindow(String selwindowname, Ticket ticket) {
this.selwindowname = selwindowname;
this.ticket = ticket;
}
@Override
public void run() {
sl();
}
private synchronized void sl(){
while(flag){
System.out.println(selwindowname+"...."+ticket.sellTicket());
if(ticket.sellTicket()==0){
flag = false;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
}
}
class Ticket {
private int ticketnum;
public Ticket(int ticketnum) {
this.ticketnum = ticketnum;
}
/*
* 卖票
*/
public synchronized int sellTicket(){
if(ticketnum>0){
return ticketnum--;
}else{
return 0;
}
}
}
应该是线程哪里的不同步造成的, 用了synchronized , 照理来说 线程1进去了 线程2不会进才对.. 但是 ticketnum-- 还是被4条线程同时做了计算, 不知道是什么情况 各种求解
|