采用多线程模拟排队叫号

采用多线程模拟排队叫号

关于排队叫号想必大家都了解:比如去银行,都会有取号机,银行窗口每办理完一个业务都会叫下一个排队的号去处理业务,一个人不会被多个窗口同时叫号,所以这里也涉及到了一个多线程共享数据的问题:我们先用代码简单模拟一下流程:

/**
 * @program: ThreadDemo
 * @description: 模拟柜台
 * @author: hs96.cn@Gmail.com
 * @create: 2020-08-27
 */
public class Bank {
    public static void main(String[] args) {
       TicketWindowOneThread ticketWindowOneThread = new TicketWindowOneThread("一号柜台");
        ticketWindowOneThread.start();
    }
}
/**
 * @program: ThreadDemo
 * @description: 模拟银行窗口处理业务
 * @author: hs96.cn@Gmail.com
 * @create: 2020-08-27
 */
public class TicketWindowOneThread extends Thread{
    private final String name;
    private static final int MAX = 50;
    private int index = 1;

    public TicketWindowOneThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        // 当当前号码数小于最大号码时,进行售票操作
        while (index <= MAX) {
            System.out.println("柜台:" + name + ",当前的号码是:" + (index++));
        }
    }
}

运行效果如下:

这个输出毫无疑问,目前是单线程动作,接下来模拟三个窗口来模拟下真实的银行处理过程:

/**
 * @program: ThreadDemo
 * @description: 模拟柜台叫号
 * @author: hs96.cn@Gmail.com
 * @create: 2020-08-27
 */
public class Bank {
    public static void main(String[] args) {
        TicketWindowOneThread ticketWindowOneThread1 = new TicketWindowOneThread("一号柜台");
        ticketWindowOneThread1.start();

        TicketWindowOneThread ticketWindowOneThread2 = new TicketWindowOneThread("二号柜台");
        ticketWindowOneThread2.start();

        TicketWindowOneThread ticketWindowOneThread3 = new TicketWindowOneThread("三号柜台");
        ticketWindowOneThread3.start();
    }
}

运行结果如下:

这时候每个柜台都按照自己的号来叫,也就是窗口的index没有在线程之间同步,那么如何解决呢?

其实也很简单:只要用static修饰一下就好了:

运行效果如下:

可以看到三个线程已经实现共享TicketWindowOneThreadindex了。但是可以看到输出的顺序颠倒了,这个我们后续再优化,先理解这个线程共享资源的概念即可。

posted @ 2020-08-27 02:51  风暴松鼠  阅读(484)  评论(0)    收藏  举报