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

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

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
原文地址:https://www.cnblogs.com/Ming8006/p/6930355.html