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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尹善波 中级黑马   /  2012-7-12 02:16  /  3339 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Count  
{
               public static void main(String[] args) {
                Ti t = new Ti();
                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);
               
                t1.start();
                t2.start();
        }      
}
class Ti implements Runnable
{
  private  int num = 0;
   
  public  void run()
{
    while (true)
   {
   if ((num++)<100)
     {        
                System.out.println(Thread.currentThread().getName()+ ",你是第" + num +"个使用ti的人");
     }
    }
    }   
}
根据买票的代码改了一下,运行结果倒是可以,就是cmd得出结果一会儿后出现连续不断的运行
而且显示num的值全为负数,请问这是怎么回事?

QQ截图20120712021336.png (11.01 KB, 下载次数: 62)

QQ截图20120712021336.png

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

9 个回复

倒序浏览
兄弟,我快困死了,但是终于给你改过来了
class Count  
{
               public static void main(String[] args) {
                Ti t = new Ti();
                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);
               
                t1.start();
                t2.start();
        }      
}
class Ti implements Runnable
{
  private  int num = 0;
   
  public  void run()
{
    while (true)
   {
   if (((num++)<100)&(num>0))
     {        
                System.out.println(Thread.currentThread().getName()+ ",你是第" + num +"个使用ti的人");
     }
    }
    }   
}

红色部分你只要该下就行了,不然就是死循环,下面我传个我运行的结果

未命名.jpg (82.35 KB, 下载次数: 59)

未命名.jpg

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
刚才我给你说了一种方法,另一种就是把num定义为public,不能定义为private,因为你如果定义私有的话,下面的循环就无法访问num,也就是说白定义了,明白了吗。改完后能正常运行,结果和我上面传的截图一样,我就不多说了,困死了
回复 使用道具 举报
出现负数的原因是由于数据存储的造成的

你们写个while(true)这不是死循环么
当num的值由0不断地增加num的值就会不断变大
但是每个类型的值总会有个最大值吧,当num到达最大值时
二进制最高位就会由0变为1,就意味着num由正数变为负数
就会出现 上面的结果啦

我想你要表达的应该是这个意思吧
  1. public void run() {
  2.                 while (num < 100) {
  3.                         System.out.println(Thread.currentThread().getName() + ",你是第" + num + "个使用ti的人");
  4.                         num++;
  5.                 }
  6.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 haiyualong 于 2012-7-12 10:54 编辑

出现问题的原因板凳已经给你说了。简单一点的修改是在你的if 语句后面添加一句 else return;或者是 else break;应该就可以了。售票系统最好采用同步机制,把票放在同步代码块里面,否则可能会出现意想不到的问题
回复 使用道具 举报
曹印亮 发表于 2012-7-12 06:53
兄弟,我快困死了,但是终于给你改过来了
class Count  
{

谢谢啦,不容易啊
回复 使用道具 举报
张天天 发表于 2012-7-12 07:05
出现负数的原因是由于数据存储的造成的

你们写个while(true)这不是死循环么

{:3_64:},每个类型的值总会有个最大值吧,当num到达最大值时
二进制最高位就会由0变为1,就意味着num由正数变为负数
就会出现 上面的结果啦,高,实在是高啊!
回复 使用道具 举报
class Count  
{
               public static void main(String[] args) {
                Ti t = new Ti();
                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);
               
                t1.start();
                t2.start();
        }      
}
class Ti implements Runnable
{
  private  int num = 0;
   
  public  void run()
{
    while (true)   //你没有写退出循环的语句,所以当if的判断执行完之后,会成为死循环,不会退出
   {
   if ((num++)<100)
     {        
                System.out.println(Thread.currentThread().getName()+ ",你是第" + num +"个使用ti的人");
     }
    }
    }   
}
回复 使用道具 举报
超过了int的值了,当num为int最大值时,加1,就称为了int最小值
回复 使用道具 举报
其实楼上的哥们都忽略了一个因素,你只是打印出了结果,这个进程还是在不断的继续执行,就像楼上的哥们说的那样,到了一定的时候由于这个是int类型的,就会变成int类型的最小值,仍然打印。其实排除这个因素,这也是一个死循环,因为while(true)这本来就是一个死循环,楼主并没有给出循环结束的条件,或者什么时候循环跳出。比如说你加上一个else,也可以看出这个循环是死循环。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马