黑马程序员技术交流社区

标题: 线程问题 [打印本页]

作者: 赵庆礼    时间: 2012-6-27 08:17
标题: 线程问题
本帖最后由  赵庆礼 于 2012-6-27 11:47 编辑

class Ticket implements Runnable
{
        private int tick =100;
        private Object obj = new Object();
        public void run()
        {
               
                while (true)
                {
                        synchronized(obj)
                        {
                                if(tick>0)
                                {
                                        try
                                        {
                                                Thread.sleep(10);
                                                System.out.println(Thread.currentThread().getName()+"run ...."+tick--);
                                        }
                                        catch (Exception e)
                                        {
                                        }
                                        System.out.println(Thread.currentThread().getName()+"run ...."+tick--);
                                }
                        }
                }
        }
}
class ThreadDemo2
{
        public static void main(String[] args)
        {
                Ticket t =  new Ticket();
                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);
                Thread t3 = new Thread(t);
                Thread t4 = new Thread(t);
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}
这儿程序执行后为什么cpu占用率特别大,调试了很久没有找到原因在哪
作者: 韦念欣    时间: 2012-6-27 08:39
本帖最后由 韦念欣 于 2012-6-27 08:46 编辑


楼主的循环while(true)是无限循环,没有出口,当票卖完之后,也出不来,程序就再那里死循环了,而且是4个线程在空转(死循环),所以占用CPU很高!
可以在if代码块后面添加break;跳出循环的语句。
具体修订代码如下:
  1. class Ticket implements Runnable
  2. {
  3.         private int tick =1000;              // 为了更好的看到线程效果,设置tick数量大一些
  4.         private Object obj = new Object();
  5.         public void run()
  6.         {
  7.                 while (true)
  8.                 {
  9.                         synchronized(obj)
  10.                         {
  11.                                 if(tick>0)
  12.                                 {
  13.                                         try
  14.                                         {
  15.                                                 Thread.sleep(10);
  16.                                                 System.out.println(Thread.currentThread().getName()+"run ...."+tick--);
  17.                                         }
  18.                                         catch (Exception e)
  19.                                         {
  20.                                         }
  21.                                         //System.out.println(Thread.currentThread().getName()+"run ...."+tick--);  
  22.                                 }
  23.                                  else                            // 在这里添加if的配对语句else
  24.                                          break;                // 如果tick不大于0,则break跳出循环,防止程序空转(死循环)
  25.                         }
  26.                 }
  27.         }
  28. }
  29. class ThreadDemo2
  30. {
  31.         public static void main(String[] args)
  32.         {
  33.                 Ticket t =  new Ticket();
  34.                 Thread t1 = new Thread(t);
  35.                 Thread t2 = new Thread(t);
  36.                 Thread t3 = new Thread(t);
  37.                 Thread t4 = new Thread(t);
  38.                 t1.start();
  39.                 t2.start();
  40.                 t3.start();
  41.                 t4.start();
  42.         }
  43. }
复制代码

作者: 李文龙    时间: 2012-6-27 08:48
  while (true)
这个地方的问题,当票卖完的时候,程序依旧还在进行循环,没有退出运行,所以占用的cpu资源会一直存在,且呈上升的趋势,因为内存空间没有被释放掉,解决的方法是将循环的条件改为  while (tick>0)  就可以了。
作者: 常佳杰    时间: 2012-6-27 09:41
还有一种方式等tick!>0时,关闭线程也可以

  1. class Ticket implements Runnable
  2. {
  3.         private int tick =100;
  4.         private Object obj = new Object();
  5.         public void run()
  6.         {               
  7.                 while (true)
  8.                 {
  9.                         synchronized(obj)
  10.                         {
  11.                                 if(tick>0)
  12.                                 {
  13.                                         try
  14.                                         {
  15.                                                 Thread.sleep(10);
  16.                                                 System.out.println(Thread.currentThread().getName()+"run ...."+tick--);
  17.                                         }
  18.                                         catch (Exception e)
  19.                                         {
  20.                                         }
  21.                                         System.out.println(Thread.currentThread().getName()+"run ...."+tick--);
  22.                                 }
  23.                                  else{
  24.                                                  t1.stop();
  25.                                                  t2.stop();
  26.                                                  t3.stop();
  27.                                                  t4.stop();
  28.                                          }
  29.                         }
  30.                 }
  31.         }
  32. }
  33. class ThreadDemo2
  34. {
  35.         public static void main(String[] args)
  36.         {
  37.                 Ticket t =  new Ticket();
  38.                 Thread t1 = new Thread(t);
  39.                 Thread t2 = new Thread(t);
  40.                 Thread t3 = new Thread(t);
  41.                 Thread t4 = new Thread(t);
  42.                 t1.start();
  43.                 t2.start();
  44.                 t3.start();
  45.                 t4.start();
  46.         }
  47. }
复制代码

作者: 赵庆礼    时间: 2012-6-27 11:46
韦念欣 发表于 2012-6-27 08:39
楼主的循环while(true)是无限循环,没有出口,当票卖完之后,也出不来,程序就再那里死循环了,而且是4 ...

谢谢,看懂了
作者: 赵庆礼    时间: 2012-6-27 12:00
韦念欣 发表于 2012-6-27 08:39
楼主的循环while(true)是无限循环,没有出口,当票卖完之后,也出不来,程序就再那里死循环了,而且是4 ...

谢谢,看懂了




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