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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄玉昆 于 2013-2-15 23:24 编辑
  1. /*测试一: 简单的卖票程序:多个窗口同时卖票
  2. */
  3. class Ticket implements Runnable
  4. {
  5.         private static int tic = 20;
  6.         public void run()
  7.         {
  8.                 while(tic > 0)
  9.                 {
  10.                         System.out.println(Thread.currentThread().getName() + "sale:" + tic--);
  11.                 }
  12.         }
  13. }

  14. class  TicketDemo
  15. {
  16.         public static void main(String[] args)
  17.         {
  18.                 Ticket t = new Ticket();
  19.                 Thread t1 = new Thread(t);//创建一个线程
  20.                 Thread t2 = new Thread(t);//创建一个线程
  21.                 Thread t3 = new Thread(t);//创建一个线程
  22.                 Thread t4 = new Thread(t);//创建一个线程
  23.                 t1.start();
  24.                 t2.start();
  25.                 t3.start();
  26.                 t4.start();
  27.         }
  28. }
复制代码
  1. /*
  2. 测试二:简单的卖票程序:多个窗口同时卖票
  3. */
  4. class Ticket implements Runnable
  5. {
  6.         private static int tic = 20;
  7.         public void run()
  8.         {
  9.                 while(true)
  10.                 {
  11.                         if (tic > 0)
  12.                                 System.out.println(Thread.currentThread().getName() + "sale:" + tic--);
  13.                 }
  14.         }
  15. }

  16. class  TicketDemo
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 Ticket t = new Ticket();
  21.                 Thread t1 = new Thread(t);//创建一个线程
  22.                 Thread t2 = new Thread(t);//创建一个线程
  23.                 Thread t3 = new Thread(t);//创建一个线程
  24.                 Thread t4 = new Thread(t);//创建一个线程
  25.                 t1.start();
  26.                 t2.start();
  27.                 t3.start();
  28.                 t4.start();
  29.         }
  30. }
复制代码
运行的结果如图:
为什么第二个结果打印完了,程序还在运行,停不下来了,需要ctrl+c才能停止运行。而且我试过,将tic变得很大,我的电脑突然就慢了,很慢很慢,快要崩溃了!!!

测试1.png (9.05 KB, 下载次数: 86)

测试1.png

测试2.png (8.46 KB, 下载次数: 74)

测试2.png

3 个回复

倒序浏览
第二个程序加个 break; 外循环永远是 true,这样执行会吃光内存,严重内存泄露.....{:soso_e127:}
回复 使用道具 举报
本帖最后由 冯佩 于 2013-2-14 23:14 编辑

class Ticket implements Runnable
{
        private int tick = 20;
        Object obj = new Object();
        boolean flag = true;
        public void run()
        {
                while (flag)
                {
                        synchronized(obj)
                        {
                                if (tick>0)
                                {
                                        try
                                        {
                                                Thread.sleep(20);                                       
                                        }
                                        catch (Exception e)
                                        {

                                        }
                                        System.out.println(Thread.currentThread().getName() + ".......sale:" + tick--);
                                }
                                else
                                         flag=false;
                        }
                }
        }
}
你加个锁,把代码改成我这样,再运行就没问题了。首先说一下,由于你没有加入同步代码块,你的两次运行的代码都是不安全的,都可能打印错票,而且,实现Runnable接口的多线程方式,资源本身就被独立出来了,所以不必将tick定义成静态变量。第一次能停下来,是因为tick做为了循环条件,当tick<=0时,while循环结束,run方法执行完毕,线程就停下来了。第二次测试停不下来是因为当tick<=0时,票售完了,但while并没有结束,run方法也就没有结束,所以线程停不下来占据着极大的系统资源,而使电脑变慢。加个判断标记作为循环条件,当tick<=0时,让标记为假线程就会停下来了。
回复 使用道具 举报
冯佩 发表于 2013-2-14 23:02
class Ticket implements Runnable
{
        private int tick = 20;

嗯啊,我测试了while,是和这有关系,现在已经解决了。谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马