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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Tauruszzy 中级黑马   /  2015-5-12 18:33  /  251 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代码一
  1. class Ticket extends Thread
  2. {
  3.         private int tick=100;
  4.         public void run()
  5.         {
  6.                 while(tick>0)
  7.                 {
  8.                         System.out.println(currentThread().getName()+"     "+"tick="+tick--);
  9.                 }
  10.         }
  11. }

  12. class  TicketDemo
  13. {
  14.         public static void main(String[] args)
  15.         {
  16.                 Ticket t1=new Ticket();
  17.                 Ticket t2=new Ticket();
  18.                 Ticket t3=new Ticket();
  19.                 Ticket t4=new Ticket();
  20.                 t1.start();
  21.                 t2.start();
  22.                 t3.start();
  23.                 t4.start();
  24.         }
  25. }
复制代码
运行结果:

  1. <b>Thread-1     tick=3</b>
  2. <b>Thread-1     tick=2</b>
  3. <b><font color="#ff0000">Thread-1     tick=1</font></b>
  4. <b>Thread-3     tick=20</b>
  5. <b>Thread-3     tick=19</b>
  6. <b>Thread-3     tick=18</b>
  7. <b>Thread-3     tick=17</b>
  8. <b>Thread-3     tick=16</b>
  9. <b>Thread-3     tick=15</b>
  10. <b>Thread-3     tick=14</b>
  11. <b>Thread-3     tick=13</b>
  12. <b>Thread-3     tick=12</b>
  13. <b>Thread-3     tick=11</b>
  14. <b>Thread-3     tick=10</b>
  15. <b>Thread-3     tick=9</b>
  16. <b>Thread-3     tick=8</b>
  17. <b>Thread-3     tick=7</b>
  18. <b>Thread-3     tick=6</b>
  19. <b>Thread-3     tick=5</b>
  20. <b>Thread-3     tick=4</b>
  21. <b>Thread-3     tick=3</b>
  22. <b>Thread-3     tick=2</b>
  23. <font color="#ff0000">Thread-3     tick=1</font>
复制代码
发现运结果中两处红色的地方相同,但是平时卖票窗口不会卖出两张相同的票,不合实际,那么将代码一改为代码二试一下:
代码二
  1. <b>class Ticket extends Thread</b>
  2. <b>{</b>
  3. <b>        private </b><font color="#ff0000">static</font><b> int tick=100;</b>
  4. <b>        public void run()</b>
  5. <b>        {</b>
  6. <b>                while(tick>0)</b>
  7. <b>                {</b>
  8. <b>                        System.out.println(currentThread().getName()+"     "+"tick="+tick--);</b>
  9. <b>                }</b>
  10. <b>        }</b>
  11. <b>}</b>

  12. <b>class  TicketDemo</b>
  13. <b>{</b>
  14. <b>        public static void main(String[] args) </b>
  15. <b>        {</b>
  16. <b>                Ticket t1=new Ticket();</b>
  17. <b>                Ticket t2=new Ticket();</b>
  18. <b>                Ticket t3=new Ticket();</b>
  19. <b>                Ticket t4=new Ticket();</b>
  20. <b>                t1.start();</b>
  21. <b>                t2.start();</b>
  22. <b>                t3.start();</b>
  23. <b>                t4.start();</b>
  24. <b>        }</b>
  25. <b>}</b>
复制代码



运行结果如下:
  1. Thread-1     tick=50
  2. Thread-2     tick=51
  3. Thread-1     tick=46
  4. Thread-0     tick=47
  5. Thread-3     tick=48
  6. Thread-0     tick=43
  7. Thread-1     tick=44
  8. Thread-2     tick=45
  9. Thread-1     tick=40
  10. Thread-0     tick=41
  11. Thread-3     tick=42
  12. Thread-3     tick=36
  13. Thread-0     tick=37
  14. Thread-0     tick=34
  15. Thread-0     tick=33
  16. Thread-0     tick=32
  17. Thread-0     tick=31
  18. Thread-0     tick=30
  19. Thread-0     tick=29
  20. Thread-0     tick=28
  21. Thread-0     tick=27
  22. Thread-0     tick=26
复制代码
发现使用了静态之后就避免了这个问题,但是静态因为常驻内存,所以也不推荐使用这种方式,那么问题来了,该如何解决这个问题呢?

代码三
  1. class Ticket extends Thread
  2. {
  3.         private static int tick=100;
  4.         public void run()
  5.         {
  6.                 while(tick>0)
  7.                 {
  8.                         System.out.println(currentThread().getName()+"     "+"tick="+tick--);
  9.                 }
  10.         }
  11. }

  12. class  TicketDemo
  13. {
  14.         public static void main(String[] args)
  15.         {
  16.                 Ticket t1=new Ticket();
  17.                 //Ticket t2=new Ticket();
  18.                 //Ticket t3=new Ticket();
  19.                 //Ticket t4=new Ticket();
  20.                 t1.start();
  21.                 t1.start();
  22.                 t1.start();
  23.                 t1.start();
  24.         }
  25. }
复制代码
编译通过,运行时结果没有问题,但是给出如下提示:

  1. Thread-0     tick=1
  2. Exception in thread "main" java.lang.IllegalThreadStateException
  3.         at java.lang.Thread.start(Unknown Source)
  4.         at TicketDemo.main(TicketDemo.java:22)
复制代码

即为程序中创建多个相同名称的线程造成的。那么还有没有更好的办法呢?请看下一篇多线程_06 ,引进多线程的另一种创建方式。

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马