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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 nine789 于 2015-6-25 20:46 编辑

多线程售票程序问题:和其他问题

问题一:怎么用循环创建不同名的多个对象?(不用循环也可以)          创建的对象需要有名字,不需要手动去写1000个对象,用程序创建。
例如:   Sing s = new Sing();             Sing s2 = new Sing();
             .........
             Sing s999 = new Sing();

问题二:在非静态情况下,同步方法和同步代码块能否同时使用? 如果不能,为什么?

***********************************************************
下面是多线程售票问题
解释说明:程序模拟   北京火车站  的流程
在北京有多个火车站,其中每个火车站都有售票窗口和退票窗口
火车票是有最大数量的,也就是说从北京出发火车票,最多有200张(假如最多有200张),然后有些窗口可以退票的,退回来的票,可以继续被售出。

问题:在多线程售票的过程中,用同步代码块和同步方法以此交替执行,会出现问题,原因是 没有是没有用static 修饰火车票的数量。
因为火车票是不固定的,有退票的,也有买票的,所以不能用静态修饰,既然没有用静态修饰,那么售票窗口也是不可以用静态修饰的。这就是问题一的出现。
问题二的出现是因为我想new一个 World,在我创造的世界里有很多个地区,每个地区有很多个可以火车站,所以我想创建很多个火车站,所以需要new非常多的火车站对象,(既然是程序员,那就不能手动打出来几百行相同的代码),所以问题二就出现了。
问题三:下面的代码,我执行后 代码(火车站类)运行后会出现蓝屏,电脑配置i3 的,10G内存,运行后,20秒就会出现蓝屏。

还有就是我使用 集合存储火车票,但是知道火车站一开始就有一定数量的车票,所以就在退票窗口 用了一个构造函数来初始化火车票的数量,但是测试运行时蓝屏。
目前代码只写到了这里,浪费了我一天的时间,如果有哪位大神有兴趣的话,可以帮个忙,帮我补完程序代码,顺便先写清楚自己的思路,非常感谢。

有什么新问题的话或者有任何新的进展,我会在下面补充此帖子的最后面,用红色标出来,然后修改此贴的!
***********************问题1、既然在售票类的run方法中定义了车票的数量,为什么一开始运行的时候,有时会会出现空指针异常?
在没有退票的情况下,票被出售完以后,if判断的是   TICKETSS.size()>0 的时候才去执行售票的,为什么在卖完的时候,还会继续打印出来 没票的情况?而且有时候还会卖出同样的票?
在加锁的情况下,没有票的时候,是不去执行售票代码的,为什么 还会出售空票?(难道是无座的站票?----而且这个无座的站票,还是卖不完的那种!不会停止,)
有时候还会出现 死锁的情况,或者是我电脑卡了,
北京站:售票:窗口3:5-----同步代码块
北京站:售票:窗口3:4-----同步代码块
北京站:售票:窗口2:5-----同步代码块
北京站:售票:窗口1:2-----同步代码块
北京站:售票:窗口1:null-----同步代码块
北京东站:售票:窗口4:null-----同步代码块
空票错误已解决,看下面帖子地址
今天补全的    火车站类    ,和新出现的问题帖子地址:
http://bbs.itheima.com/thread-207441-1-1.html
**********************
此类为火车站类:
  1. package review;

  2. import java.util.TreeSet;

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

  5.         TreeSet<Integer> TICKETSS = new TreeSet<Integer>();//火车站车票池
  6.         
  7.         //private  int TICKETS = 200;// 定义票数
  8.         public void run(){        
  9.                 for(int x = 1;x<100;x++){
  10.                         TICKETSS.add(x);
  11.                 }
  12.                 while(true){        
  13.                         //synchronized(Depot.class){                        
  14.                         //        if(TICKETS > 0){        
  15.                                         try {
  16.                                                 Thread.sleep(7);
  17.                                         } catch (InterruptedException e) {
  18.                                                 // TODO Auto-generated catch block
  19.                                                 e.printStackTrace();
  20.                                         }
  21.                                         GetTicketWindows gtw = new GetTicketWindows();
  22.                                         Thread t1 = new Thread(gtw);
  23.                                         Thread t2 = new Thread(gtw);
  24.                                         Thread t3 = new Thread(gtw);
  25.                                         Thread t4 = new Thread(gtw);
  26.                                         t1.setName(Thread.currentThread().getName()+"售票:窗口1:");
  27.                                         t2.setName(Thread.currentThread().getName()+"售票:窗口2:");
  28.                                         t3.setName(Thread.currentThread().getName()+"售票:窗口3:");
  29.                                         t4.setName(Thread.currentThread().getName()+"售票:窗口4:");
  30.                                         t1.start();
  31.                                         t2.start();
  32.                                         t3.start();
  33.                                         t4.start();
  34.                                 //}        
  35.                         //}               
  36.                 }
  37.         }
  38.                         
  39. /************售票窗口***********************/
  40. /**售票代码开始**/
  41. private  class GetTicketWindows implements Runnable{
  42.         public void run() {
  43.                 // 重写Runnable中的run方法
  44.                 int s = 0;
  45.                 while (true) {
  46.                         if (s % 2 == 0) {
  47.                                 /****同步代码块开始******/
  48.                                 synchronized (GetTicketWindows.class) {
  49.                                         if (TICKETSS.size() > 0) {
  50.                                                 try {
  51.                                                         Thread.sleep(21);
  52.                                                 } catch (InterruptedException e) {
  53.                                                         // TODO Auto-generated catch block
  54.                                                         e.printStackTrace();
  55.                                                 }                                                                                                                        
  56.                                                 System.out.println(Thread.currentThread().getName()
  57.                                                                 +/* (TICKETSS.size())+*/TICKETSS.pollLast()+ "-----同步代码块" );
  58.                                         }
  59.                                 }
  60.                                 /******同步代码块结束*******/
  61.                         }
  62.                         //else {
  63.                                 //check();
  64.                         //}
  65.                         s++;
  66.                 }
  67.         }

  68.         /***同步方法开始**/
  69. //        private  synchronized void check() {//静态同步方法的锁是所在类的class对象,动态同步方法的锁为当前调用该方法的对象,也就是this指向的对象
  70. //                if (TICKETS > 0) {
  71. //                        try {
  72. //                                Thread.sleep(21);
  73. //                        } catch (InterruptedException e) {
  74. //                                // TODO Auto-generated catch block
  75. //                                e.printStackTrace();
  76. //                        }
  77. //                        System.out.println(Thread.currentThread().getName() + + (TICKETS--)+ "-----同步代方法" );
  78. //                }
  79. //        }
  80.         /***同步方法结束**/
  81. }
  82. /****售票代码结束****/        

  83. /*************退票窗口**********************/
  84. class SetTicketWindows implements Runnable{
  85. <font color="#ff0000">/*        SetTicketWindows(){    //蓝屏代码。已经屏蔽
  86.                 for(int x = 1;x<100;x++){
  87.                         TICKETSS.add(x);
  88.                 }
  89.         }*/</font>
  90.         public void run(){
  91.                
  92.         }

  93. }
  94. }
复制代码
演示类:
  1. package review;

  2. import review.Depot;

  3. public class ThreadTicketDemo {
  4.         public static void main(String[] args) {
  5.                 Depot dt = new Depot();
  6.                 Thread x1 = new Thread(dt);
  7.                 Thread x2 = new Thread(dt);
  8.                 Thread x3 = new Thread(dt);
  9.                 Thread x4 = new Thread(dt);
  10.                 x1.setName("北京站:");
  11.                 x2.setName("北京西站:");
  12.                 x3.setName("北京南站:");
  13.                 x4.setName("北京东站:");
  14.                 x1.start();
  15.                 x2.start();
  16.                 x3.start();
  17.                 x4.start();

  18.         }
  19. }
复制代码







3 个回复

倒序浏览
大家看完后,帮忙顶个贴!

问题出现了 就要解决,非常感谢大家为我顶贴!

非常感激!
回复 使用道具 举报
帮忙顶个贴  都没人么
回复 使用道具 举报
多个对象,用数组,好,http链接://zhidao.baidu.com/question/514330599.html

蓝屏以后记下蓝屏代码。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马