解决方案 »

  1.   

    同步的位置不对,你想想,不是买票的事件需要同步,而是要卖出的票要同步稍微改了下,是一次卖一张的import java.util.ArrayList;
    import java.util.List;public class ThreadDemo {
        public static void main(String[] args) {
            Thread t1 = new Thread(new SealWindow(),"1号售票窗口");
            Thread t2 = new Thread(new SealWindow(),"2号售票窗口");
            Thread t3 = new Thread(new SealWindow(),"3号售票窗口");
            Thread t4 = new Thread(new SealWindow(),"4号售票窗口");
            Thread t5 = new Thread(new SealWindow(),"5号售票窗口");
            t1.start();
            t2.start();
            t3.start();
            t4.start();
            t5.start();
        }
     
    }
     
    class Ticket {
        private int id;
     
        public int getId() {
            return id;
        }
     
        public void setId(int id) {
            this.id = id;
        }
     
    }
     
    class SealWindow implements Runnable {
        @Override
        public void run() {
            sellTicket();
        }
     
        public void sellTicket() {
            TicketSealCenter tsc = TicketSealCenter.getInstance();
            Ticket ticket = tsc.getTicket();
            while (ticket != null) {
             System.out.println(Thread.currentThread().getName() + "...."
                        + "卖了一张票,id为" + "..." + ticket.getId());
             ticket = tsc.getTicket();
            }
        }
    }
     
    // 只有一个售票中心,所以把它设置成单例
    class TicketSealCenter {
        private static List<Ticket> tickets = new ArrayList<Ticket>();
        private int ticketNum = 100;
     
        private TicketSealCenter() {
            // 给每张票设置一个唯一的ID号
            setIdToTicket(tickets);
        }
     
        public Ticket getTicket() {
    synchronized (tickets) {
    try {
    return tickets.remove(0);
    }
    catch (IndexOutOfBoundsException ex) {
    return null;
    }
    }
    } private static TicketSealCenter tsc = new TicketSealCenter();
     
        // 提供一个公有方法,获取售票中心对象
        public static TicketSealCenter getInstance() {
            return tsc;
        }
     
        private void setIdToTicket(List<Ticket> tickets2) {
            for (int i = 1; i <= ticketNum; i++) {
                Ticket ticket = new Ticket();
                ticket.setId(i);
                tickets.add(ticket);
            }
        }
      

  2.   

    引用...
    http://57share.net/portal.php?mod=view&aid=8
      

  3.   

    非常感谢 yktd26 解决了多个窗口卖出同一张票的问题,小弟还有一个疑问:现在出票顺序不是正常按原来的递增序列,这个问题有什么解决办法吗?
    3号售票窗口....卖了一张票,id为...3
    1号售票窗口....卖了一张票,id为...1
    2号售票窗口....卖了一张票,id为...5
    5号售票窗口....卖了一张票,id为...2
    4号售票窗口....卖了一张票,id为...4
    1号售票窗口....卖了一张票,id为...6
    5号售票窗口....卖了一张票,id为...9
    2号售票窗口....卖了一张票,id为...8
      

  4.   

    哦,原来如此,感谢oh_Maxy 和yktd26 大哥的解答!