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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天把昨天的代码补全了 ,但是总是会出现一些 异常,出现的的错误是 ,错误的行数不确定,请大神帮忙解答一下,昨天帖子地址:[url]http://bbs.itheima.com/thread-207208-1-1.html[/url]
****************************************
火车站3:窗口1:(售):票号:(20150001)余票:299
Exception in thread "火车站4:" Exception in thread "火车站1:" java.lang.IllegalThreadStateException
        at java.lang.Thread.start(Thread.java:704)
        at review.Depot.run(Depot.java:69)
        at java.lang.Thread.run(Thread.java:744)
java.lang.IllegalThreadStateException
        at java.lang.Thread.start(Thread.java:704)
        at review.Depot.run(Depot.java:69)
        at java.lang.Thread.run(Thread.java:744)
Exception in thread "火车站2:" java.lang.IllegalThreadStateException
        at java.lang.Thread.start(Thread.java:704)
        at review.Depot.run(Depot.java:69)
        at java.lang.Thread.run(Thread.java:744)
Exception in thread "火车站3:" java.lang.IllegalThreadStateException
        at java.lang.Thread.start(Thread.java:704)
        at review.Depot.run(Depot.java:69)
        at java.lang.Thread.run(Thread.java:744)
火车站3:窗口1:(售):票号:(20150002)余票:298

********************
        at java.lang.Thread.run(Thread.java:744)
火车站2:窗口1:(售):票号:(20150002)余票:298
火车站2:窗口1:(售):票号:(20150003)余票:297
火车站2:窗口1:(售):票号:(20150004)余票:296
火车站4:窗口[5]:【退】:票号:(20150004)余票:297
火车站1:窗口[6]:【退】:票号:(20150003)余票:298
火车站4:窗口[6]:【退】:票号:(20150002)余票:299
火车站4:窗口[6]:【退】:票号:(20150001)余票:300
Exception in thread "火车站4:窗口[6]:【退】:" Exception in thread "火车站1:窗口[5]:【退】:" java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at review.Depot$SetTicketWindows.run(Depot.java:206)
        at java.lang.Thread.run(Thread.java:744)
java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at review.Depot$SetTicketWindows.run(Depot.java:206)
        at java.lang.Thread.run(Thread.java:744)
火车站1:窗口4:(售):票号:(20150001)余票:299
火车站1:窗口4:(售):票号:(20150002)余票:298

********************
下面是今天补全的火车站类:
测试类在昨天发的帖子里:http://bbs.itheima.com/thread-207208-1-1.html
  1. package review;

  2. import java.util.LinkedList;



  3. /************火车站*************************/
  4. public class Depot implements Runnable{

  5.         //TreeSet<Integer> TICKETSS = new TreeSet<Integer>();//火车站车票池
  6.         LinkedList<Integer> TICKETSS = new LinkedList<Integer>();//未卖出车票
  7.         LinkedList<Integer> NOT_TICKETSS = new LinkedList<Integer>();//已卖出车票
  8.         int piaohao = 20150001;
  9.         int y = 300;
  10.         /*int [] TICKETSS = new int [100];*/
  11.         //private  int TICKETS = 200;// 定义票数

  12.        

  13.         Depot(){

  14.                 for(int x = 1;x<=/*TICKETSS.size()*/300;x++){//初始值为100张
  15.                         TICKETSS.add(piaohao++);
  16.                 }
  17.         }
  18.         public void run(){       
  19. /*                for(int x = 1;x<TICKETSS.size();x++){
  20.                         TICKETSS.add(x);
  21.                 }*/
  22.        
  23.                        
  24.                
  25.                 GetTicketWindows gtw = new GetTicketWindows();//售票窗口
  26.                 SetTicketWindows stw = new SetTicketWindows();//退票窗口
  27.                

  28.                 Thread t1 = new Thread(gtw);
  29.                 Thread t2 = new Thread(gtw);
  30.                 Thread t3 = new Thread(gtw);
  31.                 Thread t4 = new Thread(gtw);
  32.                
  33.                 Thread t5 = new Thread(stw);
  34.                 Thread t6 = new Thread(stw);
  35.                 //Thread t7 = new Thread(stw);
  36.                
  37.                 while(true){       
  38.                         //synchronized(Depot.class){                       
  39.                         //        if(TICKETS > 0){       
  40.                                         try {
  41.                                                 Thread.sleep(27);
  42.                                         } catch (InterruptedException e) {
  43.                                                 // TODO Auto-generated catch block
  44.                                                 e.printStackTrace();
  45.                                         }

  46.                                        

  47.                                         t1.setName(Thread.currentThread().getName()+"窗口1:(售):");
  48.                                         t2.setName(Thread.currentThread().getName()+"窗口2:(售):");
  49.                                         t3.setName(Thread.currentThread().getName()+"窗口3:(售):");
  50.                                         t4.setName(Thread.currentThread().getName()+"窗口4:(售):");
  51.                                        
  52.                                         t5.setName(Thread.currentThread().getName()+"窗口[5]:【退】:");
  53.                                         t6.setName(Thread.currentThread().getName()+"窗口[6]:【退】:");
  54.                                         //t7.setName(Thread.currentThread().getName()+"窗口[7]:【退】:");
  55.                                        
  56.                                        
  57.                                        
  58.                                         t1.start();
  59.                                         t2.start();
  60.                                         t3.start();
  61.                                         t4.start();
  62.                                        
  63.                                         t5.start();
  64.                                         t6.start();
  65.                                         //t7.start();

  66. /*                                        Ting T = new Ting();
  67.                                         Thread ting1 = new Thread();
  68.                                         Thread ting2 = new Thread();
  69.                                         ting1.setName(Thread.currentThread().getName()+"第一大厅:");
  70.                                         ting2.setName(Thread.currentThread().getName()+"第二大厅:");
  71.                                        
  72.                                         ting1.start();
  73.                                         ting2.start();*/
  74.                                 //}       
  75.                         //}               
  76.                 }

  77.         }





  78. /************售票窗口***********************/
  79. /**售票代码开始**/
  80. private  class GetTicketWindows implements Runnable{
  81.         public void run() {
  82.                 // 重写Runnable中的run方法
  83.                 //int s = 0;
  84.                 while (true) {

  85.                                
  86.                        
  87.                         //if (s % 2 == 0) {
  88.                                 /****同步代码块开始******/

  89.                                 synchronized (Depot.class) {
  90.                                         if(/*TICKETSS.isEmpty()  */ /*TICKETSS.size()< = y*/y<=0){//如果没有票,那就等待
  91.                                                
  92. /*                                                if(y==0){
  93.                                                         try {
  94.                                                                 Thread.sleep(200);
  95.                                                         } catch (InterruptedException e) {
  96.                                                                 // TODO Auto-generated catch block
  97.                                                                 e.printStackTrace();
  98.                                                         }
  99.                                                 }*/
  100.                                                 //stw.run();
  101.                                                 try {
  102.                                                         this.wait();
  103.                                                 } catch (InterruptedException e) {
  104.                                                         // TODO Auto-generated catch block
  105.                                                         e.printStackTrace();
  106.                                                 }finally{
  107.                                                         this.notify();
  108.                                                 }
  109.                                         }       
  110.                                                 if (/*TICKETSS.size()*/y > 0) {
  111.                                                         try {
  112.                                                                 Thread.sleep(27);//出票等待时间
  113.                                                         } catch (InterruptedException e) {
  114.                                                                 // TODO Auto-generated catch block
  115.                                                                 e.printStackTrace();
  116.                                                         }                                                                       
  117.                                                         synchronized(/*GetTicketWindows.class*/Depot.class){
  118.                                                                 synchronized("A"){
  119.                                                                        
  120.                                                                         y--;
  121.                                                                         NOT_TICKETSS.addFirst(TICKETSS.getFirst());//把下面这张卖出去的票增加到已卖出车票列表的第一个位置
  122.                                                                         System.out.println(Thread.currentThread().getName()
  123.                                                                                         +"票号:("+  TICKETSS.pollFirst() + ")余票:"+ (y)/*(TICKETSS.size())"-----同步代码块"*/ );
  124.                                                                 }
  125.                                                                 //this.notify();
  126.                                                                 //TICKETSS.pollFirst();
  127.                                                         }
  128.                                                        
  129.                                                        
  130.                                                        
  131.                                                 }
  132.                                 }
  133.                                 /******同步代码块结束*******/
  134.                         //}
  135.                         //else {
  136.                                 //check();
  137.                         //}
  138.                         //s++;
  139.                
  140.         }
  141.         }

  142.         /***同步方法开始**/
  143. //        private  synchronized void check() {//静态同步方法的锁是所在类的class对象,动态同步方法的锁为当前调用该方法的对象,也就是this指向的对象
  144. //                if (TICKETS > 0) {
  145. //                        try {
  146. //                                Thread.sleep(21);
  147. //                        } catch (InterruptedException e) {
  148. //                                // TODO Auto-generated catch block
  149. //                                e.printStackTrace();
  150. //                        }
  151. //                        System.out.println(Thread.currentThread().getName() + + (TICKETS--)+ "-----同步代方法" );
  152. //                }
  153. //        }
  154.         /***同步方法结束**/
  155. }
  156. /****售票代码结束****/       

  157. /*************退票窗口**********************/
  158. class SetTicketWindows implements Runnable{
  159.         public void run(){
  160.                 while(true){

  161.                                
  162.                        
  163.                                 synchronized(Depot.class){

  164.                                         if(y >= 300/* | TICKETSS == null*/){//如果没有票卖出,那就关闭退票窗口
  165.                                                
  166. /*                                                if(y==0){
  167.                                                         try {
  168.                                                                 Thread.sleep(200);
  169.                                                         } catch (InterruptedException e) {
  170.                                                                 // TODO Auto-generated catch block
  171.                                                                 e.printStackTrace();
  172.                                                         }
  173.                                                 }*/
  174.                                                
  175.                                                 try {
  176.                                                         this.wait();
  177.                                                 } catch (InterruptedException e) {
  178.                                                         // TODO Auto-generated catch block
  179.                                                         e.printStackTrace();
  180.                                                 }
  181.                                                 finally{
  182.                                                         this.notify();//告诉售票窗口,有票了
  183.                                                 }
  184.                                         }
  185.                                        
  186.                                         //if(/*(!TICKETSS.isEmpty()) | */y<299 ){//如果有票卖出,那么打开退票窗口
  187.                                                 try {
  188.                                                         Thread.sleep(27);
  189.                                                 } catch (InterruptedException e) {
  190.                                                         // TODO Auto-generated catch block
  191.                                                         e.printStackTrace();
  192.                                                 }
  193.                                                
  194. /*                                                for(int x = 1;x<=TICKETSS.size()300;x++){//初始值为100张
  195.                                                         TICKETSS.add(x);
  196.                                                 }*/
  197.                                                 synchronized(/*SetTicketWindows.class*/Depot.class){
  198.                                                         synchronized("A"){
  199.                                                                
  200.                                                                 y++;
  201.                                                                 TICKETSS.addFirst(NOT_TICKETSS.getFirst());//把下面的退票增加到未卖出车票列表中的第一个位置
  202.                                                                 System.out.println(Thread.currentThread().getName()
  203.                                                                                 +"票号:(" +  NOT_TICKETSS.pollFirst()+ ")余票:"+(y)/*(TICKETSS.size())"-----同步代码块"*/ );
  204.                                                         }
  205.                                                        
  206.                                                                         //System.out.print(  NOT_TICKETSS.pollFirst() );
  207.                                                                        
  208.                                                                         //System.out.println(")余票:"+(y)/*(TICKETSS.size())"-----同步代码块"*/ );
  209.                                                                        
  210.                                                         //NOT_TICKETSS.pollFirst();
  211.                                                 }
  212.                                 //        }
  213.                                        
  214.                                        
  215.                                 }
  216.                
  217.                 }
  218.                                
  219.         }
  220.        
  221.        
  222.        
  223. }
  224. }
复制代码



29 个回复

倒序浏览
很尽力的看了- -请楼下作答- -
回复 使用道具 举报
很尽力的看了- -请楼下作答- -
回复 使用道具 举报
虽然看不懂 ,但顶了。。
回复 使用道具 举报
膜拜一下大神
回复 使用道具 举报
空城dream 发表于 2015-6-25 21:58
虽然看不懂 ,但顶了。。

非常感谢呀
回复 使用道具 举报
其实我也不懂
回复 使用道具 举报
很尽力的看了- -请楼下作答- -
回复 使用道具 举报
感觉很厉害的样子
回复 使用道具 举报
不错顶一个!
回复 使用道具 举报
keto 中级黑马 2015-6-25 22:04:57
11#
表示已看晕@_@
回复 使用道具 举报
很尽力的看了- -请楼下作答- -
回复 使用道具 举报
(晶小羊) 发表于 2015-6-25 21:56
很尽力的看了- -请楼下作答- -

有了大家的支持,楼下肯定有大神解答的
回复 使用道具 举报
默默的顶了
回复 使用道具 举报
能写这莫多就不错了,不管写的怎么样!
回复 使用道具 举报
(晶小羊) 发表于 2015-6-25 21:56
很尽力的看了- -请楼下作答- -

有了大家的支持,楼下肯定会出现大神出来解答的
回复 使用道具 举报

是姐夫吧,:lol
回复 使用道具 举报
用不用 其他的 编绎器?
回复 使用道具 举报
表示能不能写注释。。。
回复 使用道具 举报
好长呀。。。。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马