多窗口售票:单件模式多线程实现
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--); } }
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--; } } }
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