多线程模拟银行排队
银行排队叫号的场景如图所示:
有一个出票机,按顺序出票。有多个柜台叫号。对于这样的场景,代码实现可以分为2部分,出票机和柜台。
- 出票机
public class TicketWindow implements Runnable {
private int index = 1;
private final int MAX = 50;
@Override
public void run() {
while (index <= MAX) {
System.out.println(Thread.currentThread().getName() + " 的号是:" + index++);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
新建TicketWindow类,继承Runnable接口。主要用于生成号码。这里号码从1开始,并且有一个最大值50。当小于最大值时,号码则顺序加一。
- 柜台
public class Bank {
public static void main(String[] args) {
final TicketWindow ticketWindow = new TicketWindow();
Thread t1 = new Thread(ticketWindow, "一号柜台");
Thread t2 = new Thread(ticketWindow, "二号柜台");
Thread t3 = new Thread(ticketWindow, "三号柜台");
t1.start();
t2.start();
t3.start();
}
}
模拟三个柜台的情况,每个柜台是一个单独的线程,但是它们必须共享出票数据,所以只定义一个final 的TicketWindow对象。
运行结果如下:
二号柜台 的号是:2
一号柜台 的号是:1
三号柜台 的号是:3
二号柜台 的号是:4
三号柜台 的号是:6
一号柜台 的号是:5
二号柜台 的号是:7
三号柜台 的号是:8
一号柜台 的号是:9
二号柜台 的号是:10
三号柜台 的号是:11
一号柜台 的号是:12
二号柜台 的号是:13
三号柜台 的号是:14
一号柜台 的号是:15
二号柜台 的号是:16
三号柜台 的号是:17
一号柜台 的号是:18
三号柜台 的号是:19
二号柜台 的号是:19
一号柜台 的号是:20
三号柜台 的号是:21
一号柜台 的号是:22
二号柜台 的号是:23
三号柜台 的号是:24
一号柜台 的号是:25
二号柜台 的号是:26
三号柜台 的号是:27
一号柜台 的号是:28
二号柜台 的号是:29
一号柜台 的号是:31
三号柜台 的号是:30
二号柜台 的号是:32
一号柜台 的号是:33
三号柜台 的号是:33
二号柜台 的号是:34
一号柜台 的号是:35
三号柜台 的号是:36
二号柜台 的号是:37
一号柜台 的号是:38
三号柜台 的号是:39
二号柜台 的号是:40
一号柜台 的号是:41
三号柜台 的号是:42
二号柜台 的号是:43
一号柜台 的号是:44
三号柜台 的号是:44
二号柜台 的号是:45
一号柜台 的号是:46
三号柜台 的号是:47
二号柜台 的号是:48
一号柜台 的号是:49
三号柜台 的号是:50
Process finished with exit code 0
可以看到,三个柜台同时叫号的效果了