思想:简单结合现实电影院购票的实际情况,例如:固定的位置,多个顾客同时买票,售出的票不能在出售(为什么说简单,是因为现实电影院购票的实际情况比我列举的还要复杂,所以我只列举了这些情况)
实现步骤:
-
定义影院、顾客类(顾客可以是多个,所以要继承Thread类,或者实现Runnable接口)
-
定义影院的属性(可用的位置),定义顾客的属性(可用的位置(影院的属性),预定的位置)
-
实例多个顾客对象,启动线程模拟购票(每个顾客对象需要传入影院的实例对象(影院的实例对象内存地址要一致))
-
根据顾客订购的位置去可用位置中找,如果符合则订票成功,如果票已经出售的情况下则告诉顾客该票已经出售
代码部分:public class lianxi { public static void main(String[] args) { List<Integer> list=new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); Cinema cinema=new Cinema(list); //顾客乙购买的票 List<Integer> list1=new ArrayList<Integer>(); list1.add(1); list1.add(2); list1.add(3); Customer customer=new Customer(list1,cinema); customer.setName("甲"); customer.start(); //顾客甲购买的票 List<Integer> list2=new ArrayList<Integer>(); list2.add(4); list2.add(2); list2.add(3); Customer customer2=new Customer(list2,cinema); customer2.setName("乙"); customer2.start(); } } //影院 class Cinema { private List<Integer> availablePosition;//可用位置 public List<Integer> getAvailablePosition() { return availablePosition; } public void setAvailablePosition(List<Integer> availablePosition) { this.availablePosition = availablePosition; } public Cinema(List<Integer> availablePosition) { super(); this.availablePosition = availablePosition; } } //顾客 class Customer extends Thread{ private List<Integer> ticket; private Cinema cinema; // @Override public void run() { purchaseTicket(); } public boolean purchaseTicket(){ synchronized (cinema) { List<Integer> list=new ArrayList<Integer>(); //备份所有票,以免有票不符合的情况 list.addAll(cinema.getAvailablePosition()); //移除购买的票 list.removeAll(ticket); if(cinema.getAvailablePosition().size()-list.size()==ticket.size()){ cinema.setAvailablePosition(list); System.out.println(this.getName()+"先生出票成功"); System.out.print("票号为:"); for (int i = 0; i < ticket.size(); i++) { if(ticket.size()-1==i){ System.out.println(ticket.get(i)); break; } System.out.print(ticket.get(i)+","); } return true; } System.out.println(this.getName()+"先生出票失败"); ticket.removeAll(cinema.getAvailablePosition()); StringBuilder str=new StringBuilder(); for (int i = 0; i < ticket.size(); i++) { str.append(ticket.get(i)).append(","); } str.setCharAt(str.length()-1, ' '); System.out.println(str.toString().trim()+"号票已经售出"); return false; } } public Customer(List<Integer> ticket, Cinema cinema) { super(); this.ticket = ticket; this.cinema = cinema; } }
效果图: