黑马程序员技术交流社区

标题: 运行出错 [打印本页]

作者: 尹善波    时间: 2012-7-12 02:16
标题: 运行出错
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, 下载次数: 59)

QQ截图20120712021336.png

作者: 曹印亮    时间: 2012-7-12 06:53
兄弟,我快困死了,但是终于给你改过来了
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, 下载次数: 58)

未命名.jpg

作者: 曹印亮    时间: 2012-7-12 07:03
刚才我给你说了一种方法,另一种就是把num定义为public,不能定义为private,因为你如果定义私有的话,下面的循环就无法访问num,也就是说白定义了,明白了吗。改完后能正常运行,结果和我上面传的截图一样,我就不多说了,困死了
作者: 张天天    时间: 2012-7-12 07:05
出现负数的原因是由于数据存储的造成的

你们写个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.         }
复制代码

作者: 王海宇    时间: 2012-7-12 10:53
本帖最后由 haiyualong 于 2012-7-12 10:54 编辑

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

谢谢啦,不容易啊
作者: 王宝康    时间: 2012-7-12 15:59
张天天 发表于 2012-7-12 07:05
出现负数的原因是由于数据存储的造成的

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

{:3_64:},每个类型的值总会有个最大值吧,当num到达最大值时
二进制最高位就会由0变为1,就意味着num由正数变为负数
就会出现 上面的结果啦,高,实在是高啊!
作者: 封明川    时间: 2012-7-12 17:00
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的人");
     }
    }
    }   
}
作者: 黄锦成    时间: 2012-7-12 22:40
超过了int的值了,当num为int最大值时,加1,就称为了int最小值
作者: 李思静    时间: 2012-7-13 06:50
其实楼上的哥们都忽略了一个因素,你只是打印出了结果,这个进程还是在不断的继续执行,就像楼上的哥们说的那样,到了一定的时候由于这个是int类型的,就会变成int类型的最小值,仍然打印。其实排除这个因素,这也是一个死循环,因为while(true)这本来就是一个死循环,楼主并没有给出循环结束的条件,或者什么时候循环跳出。比如说你加上一个else,也可以看出这个循环是死循环。




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