在银行、医院、移动营业厅的营业大厅都有排队等号机制,这种机制的主要作用是限流,减轻业务受理人员的压力。当你走进营业大厅后,需要先领取一张流水号纸票,然后拿着纸票坐在休息室等待叫号。
假设大厅共有四台出号机,这就意味着有四个线程在工作,下面用程序模拟一下叫号过程,约定当天最多受理 50 笔业务,也就是说号码最多可以出到 50.
package concurrent;
public class TicketWindow extends Thread {
// 柜台名称
private final String name;
// 最多受理 50 笔业务
private static final int MAX = 50;
// 排队号
private static int index = 1;
public TicketWindow(String name) {
this.name = name;
}
@Override
public synchronized void run() {
while (index <= MAX) {
System.out.println("柜台:" + name + "当前的号码时:" + (index++));
}
}
public static void main(String[] args) {
TicketWindow ticketWindow1 = new TicketWindow("1号出号机");
ticketWindow1.start();
TicketWindow ticketWindow2 = new TicketWindow("2号出号机");
ticketWindow2.start();
TicketWindow ticketWindow3 = new TicketWindow("3号出号机");
ticketWindow3.start();
TicketWindow ticketWindow4 = new TicketWindow("4号出号机");
ticketWindow4.start();
}
}
柜台:2号出号机当前的号码时:1
柜台:2号出号机当前的号码时:3
柜台:1号出号机当前的号码时:1
柜台:3号出号机当前的号码时:2
柜台:1号出号机当前的号码时:6
柜台:3号出号机当前的号码时:7
柜台:3号出号机当前的号码时:9
柜台:3号出号机当前的号码时:10
柜台:2号出号机当前的号码时:5
柜台:4号出号机当前的号码时:4
柜台:4号出号机当前的号码时:13
柜台:2号出号机当前的号码时:12
柜台:3号出号机当前的号码时:11
柜台:3号出号机当前的号码时:16
柜台:1号出号机当前的号码时:8
柜台:2号出号机当前的号码时:15
柜台:2号出号机当前的号码时:19
柜台:2号出号机当前的号码时:20
柜台:2号出号机当前的号码时:21
柜台:4号出号机当前的号码时:14
柜台:2号出号机当前的号码时:22
柜台:2号出号机当前的号码时:24
柜台:3号出号机当前的号码时:18
柜台:3号出号机当前的号码时:26
柜台:1号出号机当前的号码时:17
柜台:3号出号机当前的号码时:27
柜台:3号出号机当前的号码时:29
柜台:3号出号机当前的号码时:30
柜台:3号出号机当前的号码时:31
柜台:3号出号机当前的号码时:32
柜台:2号出号机当前的号码时:25
柜台:2号出号机当前的号码时:33
柜台:2号出号机当前的号码时:34
柜台:2号出号机当前的号码时:35
柜台:2号出号机当前的号码时:36
柜台:2号出号机当前的号码时:37
柜台:2号出号机当前的号码时:38
柜台:2号出号机当前的号码时:39
柜台:2号出号机当前的号码时:40
柜台:2号出号机当前的号码时:41
柜台:2号出号机当前的号码时:43
柜台:2号出号机当前的号码时:44
柜台:2号出号机当前的号码时:45
柜台:4号出号机当前的号码时:23
柜台:2号出号机当前的号码时:46
柜台:3号出号机当前的号码时:42
柜台:3号出号机当前的号码时:49
柜台:3号出号机当前的号码时:50
柜台:1号出号机当前的号码时:28
柜台:2号出号机当前的号码时:48
柜台:4号出号机当前的号码时:47
Process finished with exit code 0
其实这个程序是有问题的,会出现线程安全问题,例如 1 这个号码被叫了2次,另外 index 定义为静态变量,变量的生命周期会很长,也不是太好,后面会一点点优化掉这些问题。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/122823632
内容来源于网络,如有侵权,请联系作者删除!