A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lhyzxc0205 中级黑马   /  2014-12-31 23:57  /  1206 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /**
  2. * 三个类ticket,sealWindow,ticketSealCenter,代表票信息,售票窗口,售票中心,售票中心分配一定数量的票(多个窗口实现多线程售票)
  3. * @author Administrator
  4. *思路:对象票(临界资源,共享)、售票窗口(买票、退票)、售票中心(管理票:添加,减少)
  5. *三者关系:临界资源票作为资源供售票中心管理,售票窗口的操作作为售票中中心的代理进行(这里图简便直接继承)
  6. */
  7. public class TicketThread {

  8.         public static void main(String[] args) {
  9.                 final SealWindow sealWindow  = new SealWindow();
  10.                 ExecutorService threadPool = Executors.newFixedThreadPool(10);
  11.                 for(int i=0;i<10;i++){
  12.                         Runnable runnable = new Runnable(){
  13.                                 @Override
  14.                                 public void run(){
  15.                                         try {
  16.                                                 Thread.sleep(1000);
  17.                                                 Ticket ticket =sealWindow.getTicket();
  18.                                                 System.out.println(ticket);
  19.                                         } catch (InterruptedException e) {
  20.                                                 e.printStackTrace();
  21.                                         }
  22.                                 }
  23.                         };
  24.                         threadPool.execute(runnable);
  25.                 }
  26.                 try {
  27.                         Thread.sleep(3000);
  28.                 } catch (InterruptedException e) {
  29.                         // TODO Auto-generated catch block
  30.                         e.printStackTrace();
  31.                 }
  32.                 sealWindow.addTickets();
  33.                
  34.         }

  35. }
  36. //售票窗口
  37. class SealWindow extends TicketSealCenter{
  38.        
  39. }
  40. //售票中心:管理票(目前只考虑同样的票)--1.票池 2.数量 3.添加、清除、修改、查找功能
  41. class TicketSealCenter{
  42.         private Ticket[] ticketPool = new Ticket[5];
  43.         //票数总量
  44.         private int count;
  45.         //存数索引
  46.         private int putptr;
  47.         //取数索引
  48.         private int takeptr;
  49.         //对象锁
  50.         private Lock lock = new ReentrantLock();
  51.         //无票线程控制信号
  52.         private Condition ticketNotEmpty = lock.newCondition();
  53.         //添加线程控制信号
  54.         private Condition ticketAdd = lock.newCondition();
  55.        
  56.         /**
  57.          * 添加票
  58.          */
  59.         public void add(Ticket ticket){
  60.                 //上锁
  61.                 lock.lock();
  62.                 //判断票池大小是否足够(足够,添加;否则,扩容再添加)
  63.                 try {
  64.                         if(ticketPool.length<=count){
  65.                                 ticketAdd.await();
  66.                                 Ticket[] newTicketPool = new Ticket[ticketPool.length+10];
  67.                                 System.arraycopy(ticketPool, 0, newTicketPool, 0, ticketPool.length);
  68.                                 ticketPool = newTicketPool;
  69.                         }
  70.                         ticketPool[putptr++]=ticket;
  71.                         count++;
  72.                         if(putptr==ticketPool.length){
  73.                                 putptr=0;
  74.                         }
  75.                         ticketNotEmpty.signal();
  76.                 } catch (InterruptedException e) {
  77.                         e.printStackTrace();
  78.                 }
  79.                 lock.unlock();
  80.         }
  81.         /**
  82.          * 添加多张票
  83.          */
  84.         public void addTickets(){
  85.                 for(int i=1;i<100;i++){
  86.                         this.add(new Ticket("第"+i+"","张火车票"));
  87.                 }
  88.         }
  89.         /**
  90.          * 查看是否有票
  91.          * @return
  92.          */
  93.         public boolean hasTicket(){
  94.                 return count>0;
  95.         }
  96.         /**
  97.          * 取票
  98.          */
  99.         public Ticket getTicket(){
  100.                 //上锁
  101.                 lock.lock();
  102.                 Ticket ticket = null;
  103.                 //判断是否有票,若有票,则取票。否则,阻塞等待(使用while 防止伪唤醒)
  104.                 try {
  105.                         while(!this.hasTicket()){
  106.                                 ticketNotEmpty.await();
  107.                         }
  108.                         ticket = ticketPool[takeptr];
  109.                         takeptr++;
  110.                         if(takeptr==ticketPool.length){
  111.                                 takeptr = 0;
  112.                         }
  113.                         count--;
  114.                         ticketAdd.signal();
  115.                 } catch (InterruptedException e) {
  116.                         e.printStackTrace();
  117.                 }finally{
  118.                         lock.unlock();
  119.                 }
  120.                
  121.                 return ticket;
  122.         }
  123.        
  124.        
  125. }
  126. //临界类资源:票--名称、具体信息
  127. class Ticket{
  128.         @Override
  129.         public String toString() {
  130.                 return "Ticket [name=" + name + ", info=" + info + "]";
  131.         }
  132.         private String name;
  133.         private String info;
  134.        
  135.         public Ticket() {
  136.         }
  137.         public Ticket(String name, String info) {
  138.                 this.name = name;
  139.                 this.info = info;
  140.         }
  141.         public String getName() {
  142.                 return name;
  143.         }
  144.         public void setName(String name) {
  145.                 this.name = name;
  146.         }
  147.         public String getInfo() {
  148.                 return info;
  149.         }
  150.         public void setInfo(String info) {
  151.                 this.info = info;
  152.         }
  153.        
  154. }
复制代码

7 个回复

倒序浏览
厉害,哥们以前是有基础吗?报的是那一期?
回复 使用道具 举报
真是醉了,怪不得分那么高, 见过的这题属你写的最严谨了。大神大神:victory:
回复 使用道具 举报
SpiderManZZH 发表于 2015-1-6 00:58
厉害,哥们以前是有基础吗?报的是那一期?

没,在上班,还被报呢
回复 使用道具 举报
雪落纷飞 发表于 2015-1-6 01:22
真是醉了,怪不得分那么高, 见过的这题属你写的最严谨了。大神大神 ...

其实都差不多,只是当初看到这题的时候感觉用面向对象的思路写很清晰,也好实现,若是东改西改的实现功能效果没那么好
回复 使用道具 举报
好多技术分,我要努力
回复 使用道具 举报
学习中。。。
回复 使用道具 举报
enjoy 中级黑马 2015-1-14 10:18:21
8#
好流弊!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马