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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杜光 于 2013-7-3 08:55 编辑

先贴出老师的源代码.
  1. class Ticket extends Thread
  2. {
  3.         private int num = 100;
  4.         public void run()
  5.         {
  6.                 while (true)
  7.                 {
  8.                         if (num>0)
  9.                         {
  10.                                 System.out.println(Thread.currentThread().getName()+"...sale"+num);
  11.                         }
  12.                 }
  13.                
  14.         }
  15. }
  16. class TicketDemo
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 Ticket t1 = new Ticket();
  21.                 Ticket t2 = new Ticket();
  22.                 Ticket t3 = new Ticket();
  23.                 Ticket t4 = new Ticket();
  24.                 t1.start();
  25.                 t2.start();
  26.                 t3.start();
  27.                 t4.start();
  28.         }
  29. }
复制代码
第一个问题,为什么我这里和老师一模一样的代码,我输出的是 --而且还在一直循环--------而老师的确实这个?

第二个问题,老师说了,如果要4个窗口同时卖100张票,这样是不行的,那我就想到,能不能值创建一个对象t1,然后把t1的首地址值赋给其他三个对象呢?下面贴出代码:
  1. class Ticket extends Thread
  2. {
  3.         private int num = 100;
  4.         public void run()
  5.         {
  6.                 while (true)
  7.                 {
  8.                         if (num>0)
  9.                         {
  10.                                 System.out.println(Thread.currentThread().getName()+"...sale"+num);
  11.                                 
  12.                         }
  13.                 }
  14.                
  15.         }
  16. }
  17. class TicketDemo
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                
  22.                 Ticket t1 = new Ticket();//只new一个对象t1,然后把t1赋给t2,t3,t4,这样不就是把t1的首地址值赋给了另外三个对象,从而让其他三个对象都指向同一个地址吗?
  23.                 Ticket t2 = t1;
  24.                 Ticket t3 = t1;
  25.                 Ticket t4 = t1;
  26.                 t1.start();
  27.                 t2.start();
  28.                 t3.start();
  29.                 t4.start();
  30.         }
  31. }
复制代码
可是!!为什么结果却是这样???? ----------和我刚开始运行老师的代码一样,无限循环,但是这次只有一个线程---------Thread-0,为什么呢???这是第二个问题!!
直到我要点发帖之前,我还是再认真的检查了一遍,和老师的代码一个标点符号都不差...如果有人找出我的代码和老师的代码有一点不一样...我就去撞豆腐去.......
然后,现在已经是深夜了,如果今晚有人回的话,我明天再回.大家晚安.

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

10 个回复

倒序浏览
第一个问题 低级错误吧: System.out.println(Thread.currentThread().getName()+"...sale"+num);//num要--,要不无限循环
第二个问题:如果针对一个线程调用两次start会报异常,LZ的这种做法,相当于对一个已经运行的线程再次调用了start,会抛出异常的。你再仔细看下运行结果吧。
回复 使用道具 举报
kaka小明 发表于 2013-7-3 08:17
第一个问题 低级错误吧: System.out.println(Thread.currentThread().getName()+"...sale"+num);//num要-- ...

好吧,第一个问题确实是低级错误,其实我是以为(--)这符号没用..待会我就去撞豆腐去....
第二个问题我还是没懂,按照我的想法,不是应该都是指向同一个地址,然后创建4个线程么?怎么会只有 一个线程呢?
回复 使用道具 举报
  1. class Ticket extends Thread
  2. {
  3.         private int num = 100;
  4.         public void run()
  5.         {
  6.                 while (true)
  7.                 {
  8.                         if (num>0)
  9.                         {
  10.                                 System.out.println(Thread.currentThread().getName()+"...sale"+num);
  11.                                 
  12.                         }
  13.                 }
  14.                
  15.         }
  16. }
  17. class TicketDemo1
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                
  22.                 Ticket t1 = new Ticket();//只new一个对象t1,然后把t1赋给t2,t3,t4,这样不就是把t1的首地址值赋给了另外三个对象,从而让其他三个对象都指向同一个地址吗?
  23.                 Ticket t2 = t1;
  24.                 Ticket t3 = t1;
  25.                 Ticket t4 = t1;
  26.                 t1.start();
  27.                 t2.start();
  28.                 t3.start();
  29.                 t4.start();
  30.         }
  31. }
复制代码
第一个代码少了 num--符号

第二个代码中你把  t1赋值给 t2 t3 t3,那就相当于是一个线程了肯定是一个线程名称啦

两个代码都无线循环是因为 你的 if语句一直为真,所以一直执行


回复 使用道具 举报
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。
回复 使用道具 举报
楼主啊,你这是逻辑上的错误了,首先:
          Ticket t1 = new Ticket();//只new一个对象t1,然后把t1赋给t2,t3,t4,这样不就是把t1的首地址值赋给了另外三个对象,从而让其他三个对象都指向同一个地址吗?
          Ticket t2 = t1;
          Ticket t3 = t1;
          Ticket t4 = t1;
                t1.start();
                t2.start();
                t3.start();
                t4.start();
你这句不是相当于:
                t1.start();
                t1.start();
                t1.start();
                t1.start();
这样么?因为他们都是参考的同一个对象,而多线程是不允许一个对象里面有多个start()方法的,你把输出语句改为:
System.out.println(Thread.currentThread().getName()+"...sale"+num--);
多运行几遍,就会发现有时会出现IllegalThreadStateException异常
回复 使用道具 举报
xuluheng718 发表于 2013-7-3 09:14
楼主啊,你这是逻辑上的错误了,首先:
          Ticket t1 = new Ticket();//只new一个对象t1,然后把t1赋 ...

这个异常我已经看到了,不过i还是有点不明白啊...我创建了4个对象同时指向一个地址,这样的话不是等于有4个对象调用了start()方法么......怎么会变成一个对象了?
回复 使用道具 举报
杜光 发表于 2013-7-3 08:54
第一个代码少了 num--符号

第二个代码中你把  t1赋值给 t2 t3 t3,那就相当于是一个线程了肯定是一个线程名 ...

能说下   num后面这个符号(--)是啥意思?没学过啊...
回复 使用道具 举报
郑先明 发表于 2013-7-3 09:39
这个异常我已经看到了,不过i还是有点不明白啊...我创建了4个对象同时指向一个地址,这样的话不是等于有4个 ...

你只new 了一个对象出来,哪来的4个对象呢?Ticket t2 = t1,这句话的意思是让t2参考t1的对象,看看图:

从头至尾只有一个对象。
还有就是num--相当于num=num-1;

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
xuluheng718 发表于 2013-7-3 10:14
你只new 了一个对象出来,哪来的4个对象呢?Ticket t2 = t1,这句话的意思是让t2参考t1的对象,看看图:

...

原来  难怪会一直无限循环! 喔.. 我懂了,--和++是对应的是吧!!我没反应过来...我以为老师就是为了好看点随便加的符号....
现在明白了!谢谢详细解答!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马