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

© LYG 初级黑马   /  2014-4-19 10:47  /  1741 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

想问:为什么程序会一直运行下去,不是tick=0时程序就不停止运行结束了吗?
class Ticket implements Runnable//extends Thread
{
        private int tick = 100;
        public void run()
        {
                while (true)
                {
                        if(tick > 0)
                        {
                                System.out.println(Thread.currentThread().getName()+"....sale: " + tick--);
                        }
                }
        }
}

class  TicketDemo
{
        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();


                //Ticket t1 = new Ticket();
                //t1.start();
        }
}

13 个回复

倒序浏览
你没有设置tick不大于0时的条件,在你的程序中就算ticket=0或小于0还是执行while里面的语句,因为while的条件是true,是死循环,这样就好了
  1.   while (true)
  2.                 {
  3.                         if(tick > 0)
  4.                         {
  5.                                 System.out.println(Thread.currentThread().getName()+"....sale: " + tick--);
  6.                         }
  7.                         else
  8.                         {
  9.                                 break;
  10.                                
  11.                         }
  12.                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 忘川 于 2014-4-19 11:00 编辑
  1. class Ticket implements Runnable//extends Thread
  2. {
  3.         private int tick = 100;
  4.         public void run()
  5.         {
  6.                 while (true)//看到这里没有,你一直while(true),他会无限循环的,顶多tick小于0的时候不执行if语句而已
  7.                 {
  8.                         if(tick > 0)
  9.                         {
  10.                                 System.out.println(Thread.currentThread().getName()+"....sale: " + tick--);
  11.                         }

  12.                 }
  13.         }
  14. }
  15. //这块你可以这么写,定义一个标志位
  16. class Ticket implements Runnable//extends Thread
  17. {
  18.         private int tick = 100;
  19.         private boolean flag=true;//这是标志位,用于控制while语句运行
  20.         public void run()
  21.         {
  22.                 while (flag)
  23.                 {
  24.                         if(tick > 0)
  25.                         {
  26.                                 System.out.println(Thread.currentThread().getName()+"....sale: " + tick--);
  27.                         }
  28.                         else
  29.                         {
  30.                                 flag=false;//这里如果tick小于0,标志位为flase,不再进入while循环
  31.                          }

  32.                 }
  33.         }
  34. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
而且你的程序中没有加锁,容易造成数据的错误,像我下面的代码,在程序中加个锁就好了
  1. while (true) {
  2.                         if (tick > 0) {
  3.                                 synchronized (Ticket.class) {

  4.                                         if (tick > 0) {
  5.                                                 try {
  6.                                                         Thread.sleep(22);
  7.                                                 } catch (Exception e) {
  8.                                                 }
  9.                                                 System.out.println(Thread.currentThread().getName()
  10.                                                                 + "....sale: " + tick--);
  11.                                         } else {
  12.                                                 break;
  13.                                         }
  14.                                 }
  15.                         }
  16.                 }
复制代码
回复 使用道具 举报
因为while的条件一直为TRUE,所以程序还是一直在做while循环,你要这样做:先设置一个flag标示,并加入一个if判断句,当tick == 100时把flag标示设为false就行了。
  1. public class Runable {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.             Ticket t = new Ticket();

  7.             Thread t1 = new Thread(t);//创建了一个线程;
  8.             Thread t2 = new Thread(t);//创建了一个线程;
  9.             Thread t3 = new Thread(t);//创建了一个线程;
  10.             Thread t4 = new Thread(t);//创建了一个线程;
  11.             t1.start();
  12.             t2.start();
  13.             t3.start();
  14.             t4.start();


  15.             //Ticket t1 = new Ticket();
  16.             //t1.start();
  17.     }
  18. }
  19. class Ticket implements Runnable{
  20.         private boolean flag = true;
  21.     private int tick = 100;
  22.     public void run()
  23.     {
  24.             while (flag){
  25.                     if(tick > 0)
  26.                     {
  27.                             System.out.println(Thread.currentThread().getName()+"....sale: " + tick--);
  28.    
  29.                     }
  30.                     if(tick == 0){
  31.                             flag = false;
  32.                     }
  33.             }
  34.     }
  35. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 也许依然 于 2014-4-19 15:45 编辑

创建线程有两种方式
创建线程的第一种方式:继承Thread类
步骤:
1,定义类继承Thread
2,复写Thread类中的run方法
        目的:将自定义的代码存储在run方法。让线程运行
3,调用start方法
        该方法有两个作用:启动线程,调用run方法

创建线程的第二种方式:实现Runnable借口
步骤:
1,定义类实现Runnable借口
2,覆盖Runnable接口中的run方法
        将线程要运行的代码存放在run方法中
3,通过Thread类建立线程对象
4,将Runnable类接口的子类对象作为实际参数传递给Thread类的构造函数
        为什么要将Runnable接口的子类对象传递给Thread的构造函数?
                因为自定义的run方法所属的对象是Runnable接口的子类对象
                所以要让线程去指定对象的run方法;就必须明确该方法所属的对象

5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法

为什么要覆盖run方法呢?
Thread类用于描述线程
该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法

当程序开始运行时,是主线程先运行,当调用到t1.start()时,线程t1开始运行,之后线程t1,t2,t3,t4,和主线程抢占cpu,谁抢到谁执行,但是你run方法中是一个while循环,没有结束标记,老师是为了演示现象才用while循环的
,如果想结束,按Ctrl+c 或者 eclipse中 结束控制台的运行就好了,或者在循环中判断结束标记,然后break
  1. while(true){
  2.       if(tick>0)
  3.           System.out.println(Thread.currentThread()+" "+tick--);
  4.       else
  5.           break;
  6. }
复制代码











评分

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

查看全部评分

回复 使用道具 举报
LYG 初级黑马 2014-4-19 17:40:54
7#
也许依然 发表于 2014-4-19 11:24
创建线程有两种方式
创建线程的第一种方式:继承Thread类
步骤:

谢谢,看来系我没认真听啊、、:handshake
回复 使用道具 举报
LYG 初级黑马 2014-4-19 17:41:59
8#
月光海 发表于 2014-4-19 10:55
你没有设置tick不大于0时的条件,在你的程序中就算ticket=0或小于0还是执行while里面的语句,因为while的条 ...

嗯嗯,谢谢
回复 使用道具 举报
LYG 初级黑马 2014-4-19 17:43:05
9#
新人发帖,不知道格式,不好意思啊。
回复 使用道具 举报
package com.isoftstone.interview;

public class Ticket implements Runnable {

        private int ticket = 100;

        public void run() {
                        //线程 RUN 方法,
                while (true) {
                        if (ticket > 1) {
                                System.out.println(Thread.currentThread().getName() + " "
                                                + ticket--);

                        } else {
                                break;   //这里你缺少了 一个判断,
                        }
                }

        }
}




package com.isoftstone.interview;

public class TicketDemo {
        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);// 创建了一个线程;
                // 4个线程一起 调用 ticket类 中,100ticket 参数,
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }

}
回复 使用道具 举报
class Ticket implements Runnable
{
         private int tick = 100;
         boolean flag = true;
         public void run()
         {
                 while (flag)
                 {
                         if(tick > 0)
                         {
                                 System.out.println(Thread.currentThread().getName()+"....sale: " + tick--);
                         }
                         else{ flag = false;  }
                 }
         }
}
定一个标志位,控制while循环

评分

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

查看全部评分

回复 使用道具 举报
你这是死循环呀,
public void run()
        {
                while (true)
                {
                        if(tick > 0)
                        {
                                System.out.println(Thread.currentThread().getName()+"....sale: " + tick--);  //当tick等于0时,if语句不会在运行,而while还是会运行的                                                                                                                                                 //想要结束while循环,有两种方式,一个是return和break。
                        }else {
                                //return;
                               break;
                        }
                }
        }

评分

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

查看全部评分

回复 使用道具 举报
因为你while循环中设置的是true,所以程序是将一直循环下去。。。所以程序一直运行下去。。。在i
  1. 在if{...}后加上
  2. else
  3. break;
  4. 即可。。
复制代码

此外,此段代码还需要同步代码块去解决安全问题哦。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马