java并发编程学习(3)

来源:互联网 发布:sql关联表查询 编辑:程序博客网 时间:2024/05/28 15:59

多线程模拟银行排队

银行排队叫号的场景如图所示:

这里写图片描述

有一个出票机,按顺序出票。有多个柜台叫号。对于这样的场景,代码实现可以分为2部分,出票机和柜台。

  1. 出票机
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。当小于最大值时,号码则顺序加一。

  1. 柜台
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三号柜台 的号是:50Process finished with exit code 0

可以看到,三个柜台同时叫号的效果了