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

运行效果如下:

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

浙公网安备 33010602011771号