• 多窗口售票:单件模式多线程实现


    多窗口售票:单件模式多线程实现

    2017-06-01

    场景如下:总共100张票,编号1~100,三个窗口售票,售完为止。

    Tickets.java 票为单件模式,代码如下:

    package Tester;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.List;
    import java.util.ListIterator;
    
    public class Tickets {
    
        private Tickets() {
            ticketNo = 100;
            logs = new ArrayList<String>();
        }
    
        private static volatile Tickets instance;
        private Integer ticketNo;
        private List<String> logs;
    
        public static Tickets getIstance() {
            // 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率)
            if (instance == null) {
                // 同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)
                synchronized (Tickets.class) {
                    // 未初始化,则初始instance变量
                    if (instance == null) {
                        instance = new Tickets();
                    }
                }
            }
            return instance;
        }
    
        //synchronized 线程同步
        public synchronized void SellTicket(String Sellor) {
            if (ticketNo > 0) {
                AddLog(Sellor, ticketNo);
                ticketNo--;
            }
        }
    
        public void PrintLog() {
            for (String log : logs) {
                System.out.println(log);
            }
        }
    
        private void AddLog(String Sellor, int ticketNo) {
            logs.add("Sellor: " + Sellor + " TicketNo: " + ticketNo--);
        }
    }
    View Code

    MutliThread.java 多线程以继承的方式实现,代码如下:

    public class MutliThread extends Thread {
        Integer ticket = 100;
    
        public MutliThread() {
        }
    
        public MutliThread(String name) {
            super(name);
        }
    
        @Override
        public void run() {
            Tickets gV = Tickets.getIstance();
            try {
                sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            while (ticket > 0) {
                gV.SellTicket(Thread.currentThread().getName());
                ticket--;
            }
        }
    }
    View Code

    Demo.java 入口,代码如下:

    public class Demo {
    
        public static void main(String[] args) throws InterruptedException {
            // TODO Auto-generated method stub
    
            MutliThread m1 = new MutliThread("Seller1 ");
            MutliThread m2 = new MutliThread("Seller2 ");
            MutliThread m3 = new MutliThread("Seller3 ");
            m1.start();
            m2.start();
            m3.start();
            m1.join();
            m2.join();
            m3.join();
    
            Tickets gV = Tickets.getIstance();
            gV.PrintLog();
        }
    }

    结果如下:

    Sellor: Seller3  TicketNo: 100
    Sellor: Seller3  TicketNo: 99
    Sellor: Seller1  TicketNo: 98
    Sellor: Seller3  TicketNo: 97
    Sellor: Seller1  TicketNo: 96
    Sellor: Seller3  TicketNo: 95
    Sellor: Seller1  TicketNo: 94
    Sellor: Seller3  TicketNo: 93
    Sellor: Seller1  TicketNo: 92
    Sellor: Seller3  TicketNo: 91
    Sellor: Seller1  TicketNo: 90
    Sellor: Seller3  TicketNo: 89
    Sellor: Seller1  TicketNo: 88
    Sellor: Seller3  TicketNo: 87
    Sellor: Seller1  TicketNo: 86
    Sellor: Seller3  TicketNo: 85
    Sellor: Seller1  TicketNo: 84
    Sellor: Seller3  TicketNo: 83
    Sellor: Seller1  TicketNo: 82
    Sellor: Seller3  TicketNo: 81
    Sellor: Seller1  TicketNo: 80
    Sellor: Seller1  TicketNo: 79
    Sellor: Seller3  TicketNo: 78
    Sellor: Seller1  TicketNo: 77
    Sellor: Seller3  TicketNo: 76
    Sellor: Seller2  TicketNo: 75
    Sellor: Seller2  TicketNo: 74
    Sellor: Seller2  TicketNo: 73
    Sellor: Seller2  TicketNo: 72
    Sellor: Seller2  TicketNo: 71
    Sellor: Seller2  TicketNo: 70
    Sellor: Seller3  TicketNo: 69
    Sellor: Seller2  TicketNo: 68
    Sellor: Seller2  TicketNo: 67
    Sellor: Seller3  TicketNo: 66
    Sellor: Seller1  TicketNo: 65
    Sellor: Seller3  TicketNo: 64
    Sellor: Seller1  TicketNo: 63
    Sellor: Seller3  TicketNo: 62
    Sellor: Seller1  TicketNo: 61
    Sellor: Seller3  TicketNo: 60
    Sellor: Seller3  TicketNo: 59
    Sellor: Seller3  TicketNo: 58
    Sellor: Seller3  TicketNo: 57
    Sellor: Seller1  TicketNo: 56
    Sellor: Seller3  TicketNo: 55
    Sellor: Seller3  TicketNo: 54
    Sellor: Seller1  TicketNo: 53
    Sellor: Seller3  TicketNo: 52
    Sellor: Seller1  TicketNo: 51
    Sellor: Seller3  TicketNo: 50
    Sellor: Seller1  TicketNo: 49
    Sellor: Seller3  TicketNo: 48
    Sellor: Seller1  TicketNo: 47
    Sellor: Seller3  TicketNo: 46
    Sellor: Seller1  TicketNo: 45
    Sellor: Seller3  TicketNo: 44
    Sellor: Seller1  TicketNo: 43
    Sellor: Seller3  TicketNo: 42
    Sellor: Seller3  TicketNo: 41
    Sellor: Seller3  TicketNo: 40
    Sellor: Seller3  TicketNo: 39
    Sellor: Seller3  TicketNo: 38
    Sellor: Seller3  TicketNo: 37
    Sellor: Seller1  TicketNo: 36
    Sellor: Seller3  TicketNo: 35
    Sellor: Seller3  TicketNo: 34
    Sellor: Seller1  TicketNo: 33
    Sellor: Seller3  TicketNo: 32
    Sellor: Seller1  TicketNo: 31
    Sellor: Seller3  TicketNo: 30
    Sellor: Seller1  TicketNo: 29
    Sellor: Seller3  TicketNo: 28
    Sellor: Seller1  TicketNo: 27
    Sellor: Seller3  TicketNo: 26
    Sellor: Seller1  TicketNo: 25
    Sellor: Seller3  TicketNo: 24
    Sellor: Seller3  TicketNo: 23
    Sellor: Seller3  TicketNo: 22
    Sellor: Seller2  TicketNo: 21
    Sellor: Seller3  TicketNo: 20
    Sellor: Seller2  TicketNo: 19
    Sellor: Seller3  TicketNo: 18
    Sellor: Seller2  TicketNo: 17
    Sellor: Seller3  TicketNo: 16
    Sellor: Seller2  TicketNo: 15
    Sellor: Seller3  TicketNo: 14
    Sellor: Seller2  TicketNo: 13
    Sellor: Seller3  TicketNo: 12
    Sellor: Seller2  TicketNo: 11
    Sellor: Seller3  TicketNo: 10
    Sellor: Seller3  TicketNo: 9
    Sellor: Seller2  TicketNo: 8
    Sellor: Seller3  TicketNo: 7
    Sellor: Seller2  TicketNo: 6
    Sellor: Seller3  TicketNo: 5
    Sellor: Seller2  TicketNo: 4
    Sellor: Seller3  TicketNo: 3
    Sellor: Seller2  TicketNo: 2
    Sellor: Seller3  TicketNo: 1
  • 相关阅读:
    css 布局方式
    初识cv
    CSS 样式表{二}
    获取设备通讯录信息
    iOS Block界面反向传值小demo
    在iOS中如何正确的实现行间距与行高
    iOS开发- 获取本地视频文件
    view围绕圆心自转
    监测网络状态
    简单的九宫格算法与使用
  • 原文地址:https://www.cnblogs.com/Ming8006/p/6930355.html
Copyright © 2020-2023  润新知