zoukankan      html  css  js  c++  java
  • Java多线程学习——例子:模拟电影院抢座位

    Cinema——List<Integer>数据结构存储电影院座位

    public class Cinema{
        private List<Integer> seats;  //剩余座位
    
        public Cinema(List<Integer> seats) {
            this.seats = seats;
        }
    
        public boolean seatGrabbing(List<Integer> needTickets){
    
            if(needTickets.size()>seats.size()){
                return false;
            }
            synchronized (this) {
                if(needTickets.size()>seats.size()){
                    return false;
                }
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("剩余座位:" + seats);
                List<Integer> tmpSeats=new ArrayList<Integer>();
                tmpSeats.addAll(seats);
                tmpSeats.removeAll(needTickets);
                if(seats.size()-tmpSeats.size()==needTickets.size()){
                    seats=tmpSeats;
                    return true;
                }else {
                    return false;
                }
            }
        }
    }
    CinemaCustomer
    public class CinemaCustomer implements Runnable {
        private List<Integer> needTickets;    //需要的票
        private Cinema cinema;
        private boolean isGetTickets=false;
    
        public CinemaCustomer(List<Integer> needTickets, Cinema cinema) {
            this.needTickets = needTickets;
            this.cinema = cinema;
        }
    
        @Override
        public void run() {
            isGetTickets=cinema.seatGrabbing(needTickets);
            if(isGetTickets){
                System.out.println(Thread.currentThread().getName()+"抢票成功"+needTickets);
            }else{
                System.out.println("抢票失败"+needTickets);
            }
        }
    }
    GrabbingTickets
    public class GrabbingTickets {
        public static void main(String[] args) {
            List<Integer> seats=new ArrayList<Integer>();   //总座位
            seats.add(1);
            seats.add(2);
            seats.add(3);
            seats.add(4);
            seats.add(5);
            Cinema cinema=new Cinema(seats);
    
            List<Integer> seat1=new ArrayList<Integer>(); 
            seat1.add(1);
            seat1.add(2);
    
            List<Integer> seat2=new ArrayList<Integer>();  
            seat2.add(5);
            seat2.add(4);
    
            new Thread(new CinemaCustomer(seat1,cinema),"Tom").start();
            new Thread(new CinemaCustomer(seat2,cinema),"Job").start();
        }
    }

    很简单的一个例子,但是体会到了线程同步,也学会使用容器的一些常用方法。

  • 相关阅读:
    php 制表符(\t) 与单引号的疑惑。
    preg_replace 正则替换的疑惑
    命令行下使用curl,采集数据遇到的问题。
    vmware player 里的window xp 安装wamp遇到的问题
    2014年11月05日
    2014年11月05日
    让开发人员搞业务是不对的
    2014年11月05日
    web应用.表格很重要
    业务复杂
  • 原文地址:https://www.cnblogs.com/chiweiming/p/11144456.html
Copyright © 2011-2022 走看看