黑马程序员技术交流社区

标题: 大侠你在哪里?这个题死磕不出来啊?求支招 [打印本页]

作者: 微小山    时间: 2014-12-19 09:15
标题: 大侠你在哪里?这个题死磕不出来啊?求支招
大侠你在哪里?昨做了一下面试题,发现这个死磕不出来啊,有木有大侠支支招!感激不尽!编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。

作者: 后悔药    时间: 2014-12-19 12:04
本帖最后由 后悔药 于 2014-12-19 15:28 编辑

原来早上回的是这个帖子,不好意思我没看到“售票中心分配一定数量的票”,重新敲了一遍,
  1. <div class="blockcode"><blockquote>public class Test4 {

  2.         public static void main(String[] args) {

  3.                 Ticket ticket = new Ticket("芜湖", 0);
  4.                 TicketSealCenter tsc1 = new TicketSealCenter(ticket);
  5.                 SealWindow sw1 = new SealWindow(ticket);
  6.                 SealWindow sw2 = new SealWindow(ticket);
  7.                 SealWindow sw3 = new SealWindow(ticket);
  8.                 // SealWindow sw4 = new SealWindow(ticket);<p style="line-height: 30px; text-indent: 2em;"></p>

  9.                 Thread th1 = new Thread(tsc1);
  10.                 th1.setName("售票中心");
  11.                 Thread th2 = new Thread(sw2);
  12.                 th2.setName("售票窗口1");
  13.                 Thread th3 = new Thread(sw1);
  14.                 th3.setName("售票窗口2");
  15.                 Thread th4 = new Thread(sw3);
  16.                 th4.setName("售票窗口3");

  17.                 th1.start();
  18.                 th2.start();
  19.                 th3.start();
  20.                 th4.start();
  21.         }

  22. }

  23. class SealWindow implements Runnable {

  24.         private Ticket ticket;

  25.         public SealWindow(Ticket ticket) {
  26.                 this.ticket = ticket;
  27.         }

  28.         @Override
  29.         public void run() {

  30.                 while (true) {
  31.                         ticket.seal();
  32.                        
  33.                         try {
  34.                                 Thread.sleep(500);
  35.                         } catch (InterruptedException e) {
  36.                                 // TODO Auto-generated catch block
  37.                                 e.printStackTrace();
  38.                         }
  39.                 }
  40.         }
  41. }

  42. class TicketSealCenter implements Runnable {

  43.         private Ticket t;

  44.         public TicketSealCenter(Ticket t) {
  45.                 this.t = t;
  46.         }

  47.         @Override
  48.         public void run() {

  49.                 while (true) {
  50.                         // 生产芜湖车次的车票
  51.                         t.pro("芜湖");
  52.                 }
  53.         }

  54. }

  55. class Ticket {

  56.         static LinkedList<Ticket> pool = new LinkedList<Ticket>();

  57.         private String destination;
  58.         private int site = 0;

  59.         public Ticket(String destination, int site) {
  60.                 this.destination = destination;
  61.                 this.site = site;
  62.         }

  63.         private boolean flag = false;

  64.         private Lock lock = new ReentrantLock();
  65.         private Condition con_pro = lock.newCondition();
  66.         private Condition con_seal = lock.newCondition();

  67.         public void pro(String des) {
  68.                 lock.lock();
  69.                 try {
  70.                         while (flag) {
  71.                                 con_pro.await();
  72.                         }
  73.                         //每次生产若干票
  74.                         int num = (int) (Math.random() * 10)+1;
  75.                         for (int i = 0; i < num; i++) {
  76.                                 Ticket t = new Ticket(des, site++);
  77.                                 pool.addFirst(t);
  78.                                 System.out.println(Thread.currentThread().getName() + "生产了"
  79.                                                 + t.toString());
  80.                         }

  81.                         flag = true;
  82.                         con_seal.signal();

  83.                 } catch (InterruptedException e) {
  84.                         e.printStackTrace();
  85.                 } finally {
  86.                         lock.unlock();
  87.                 }

  88.         }

  89.         /**
  90.          * 这个方法被若干线程操作
  91.          */
  92.         public void seal() {

  93.                 lock.lock();
  94.                 try {
  95.                         while (!flag) {
  96.                                 con_seal.await();
  97.                         }
  98.                        
  99.                         if (pool.size() > 0) {
  100.                                 // 如果有票,售票窗口就开始卖票并打印信息
  101.                                 System.out.println(Thread.currentThread().getName() + "售出了"
  102.                                                 + pool.removeLast().toString());
  103.                         } else {
  104.                                 // 如果没有有票,唤醒售票中心线程生产票
  105.                                 flag = false;
  106.                                 con_pro.signal();
  107.                         }
  108.                 } catch (InterruptedException e) {
  109.                         e.printStackTrace();
  110.                 }finally{
  111.                         lock.unlock();
  112.                 }
  113.         }

  114.         @Override
  115.         public String toString() {
  116.                 // destination车次第site座
  117.                 return destination + "车次第" + site + "座";
  118.         }

  119. }
复制代码



作者: Seejun    时间: 2014-12-19 19:43
楼上好腻害




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2