JAVA多线程并发处理(三个窗口卖同一种票)

需求:某电影院目前正在上映国产大片,共有100张票,而他有3个窗口卖票。请设计一个程序模拟卖票

思路:
1.定义一个类SellTicket实现Runnable接口,里面定义一个成员变量 private int tickets=100;
2.在SellTTicket类中重写run()方法实现卖票

测试类:

public class 卖票案例 {
    public static void main(String[] args) {
        SellTicket my=new SellTicket();

        Thread it1=new Thread(my,"1号售票员");
        Thread it2=new Thread(my,"2号售票员");
        Thread it3=new Thread(my,"3号售票员");

        it1.start();
        it2.start();
        it3.start();


    }

}

SellTicket类:

public class SellTicket implements Runnable {
    private int tickets=100;
    @Override
    public void run(){
        while(true){
            if(tickets>0){
                System.out.println(Thread.currentThread().getName()+":"+"售出第"+tickets+"张");

              tickets--;
            }else{
                System.out.println("不好意思,票已售空");
               break;
            }
        }


    }
}

一执行
JAVA多线程并发处理(三个窗口卖同一种票)_第1张图片
便发现出现了重票漏票等情况,我们回去检查一下代码,好像也没有什么问题,

实际上问题出在

 if(tickets>0){
System.out.println(Thread.currentThread().getName()+":"+"售出第"+tickets+"张");
              tickets--;
            }

比如说1号售票员在执行完这条命令,正打算执行tickets–,2号售票员刚好进来了,此时ticekts还没有执行减1操作,所以2号售票员得到的数值和1号售票员一样。这就导致了两个窗口卖了同一张票。情况更糟一点三个窗口都可能卖一张票。

解决方法
直接把这两句改成一句,输出的同时直接tickets- -。就可以避免这种情况。因为这里只有一句话,要么执行,要么不执行,后面的售票员要么没挤进来,要么挤进来了取代前一个售票员,前一个售票员获得后面的数字。

public class SellTicket implements Runnable {
    private int tickets=100;
    @Override
    public void run(){
        while(true){
            if(tickets>0){
                System.out.println(Thread.currentThread().getName()+":"+"售出第"+tickets--+"张");

             // tickets--;
            }else{
                System.out.println("不好意思,票已售空");
                break;

            }
        }


    }
}

你可能感兴趣的:(JAVA多线程并发处理(三个窗口卖同一种票))