ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 采用多线程模拟排队叫号 关于排队叫号想必大家都了解:比如去银行,都会有取号机,银行窗口每办理完一个业务都会叫下一个排队的号去处理业务,一个人不会被多个窗口同时叫号,所以这里也涉及到了一个多线程共享数据的问题:我们先用代码简单模拟一下流程: ```java /** * @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(); } } ``` ```java /** * @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++)); } } } ``` 运行效果如下: ![](https://img.kancloud.cn/01/58/0158128f121ec4c5f2be4b7fb6231ff0_1040x224.gif) 这个输出毫无疑问,目前是单线程动作,接下来模拟三个窗口来模拟下真实的银行处理过程: ```java /** * @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(); } } ``` 运行结果如下: ![](https://img.kancloud.cn/98/96/9896e56d42257e8e8946b69dc7575165_541x282.png) 这时候每个柜台都按照自己的号来叫,也就是窗口的index没有在线程之间同步,那么如何解决呢? 其实也很简单:只要用static修饰一下就好了: ![](https://img.kancloud.cn/a2/9f/a29f9bf13a988cec6730d45927f8795c_744x452.png) 运行效果如下: ![](https://img.kancloud.cn/89/c8/89c8960e6d9c168134e47b795077f1bf_1153x382.gif) 可以看到三个线程已经实现共享`TicketWindowOneThread`的`index`了。但是可以看到输出的顺序颠倒了,这个我们后续再优化,先理解这个线程共享资源的概念即可。