黑马程序员技术交流社区

标题: 线程问题中的一些小疑惑 [打印本页]

作者: 郑元皓    时间: 2013-3-17 21:41
标题: 线程问题中的一些小疑惑
本帖最后由 郑元皓 于 2013-3-17 22:38 编辑

/*
需求:简单的卖票程序。
多个窗口同时买票。


*/
class Test implements Runnable
{
        private int x=100;
        
        public void run()
        {
                        while (true)
                        {
                                if (x>0)
                                {
                                        System.out.println(Thread.currentThread().getName()+"...run.."+x--);
                                }
                                
                        }
        }
}
class RunnableTest
{
        public static void main(String[]args)
        {
                Test t= new Test();

                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();

               
        }
}


这段程序我打印的时候不会结束。不知道是哪方面的原因。还是这里的while(true)加上去有什么用处。谁和我说说。谢谢了。
作者: 贾文泽    时间: 2013-3-17 21:49
while (true) 本来就是死循环,要怎么结束{:soso_e143:}
作者: 范天成    时间: 2013-3-17 21:51
{:soso_e127:}楼主基础有漏洞啊
作者: 何仕映    时间: 2013-3-17 21:53
因为While(true)是个死循环,就算x的值打印完了。它那是在While循环里面,只是没有打印。所以听不下来。
这里因为用的是if判断,如果不用循环则只执行一次。这个你可以用for循环改写就可以停下来了,下面是改写后的代码:
  1. class Test implements Runnable
  2. {
  3. private int x=100;

  4. public void run()
  5. {
  6. // while (true) //这是个死循环,就算x打印完了也只是不打印了,但是并没有跳出循环。
  7. // {
  8. // if (x>0)
  9. // {
  10. // System.out.println(Thread.currentThread().getName()+"...run.."+x--);
  11. // }
  12. //
  13. // }
  14. for (int x=100; x>0; --x)
  15. {
  16. System.out.println(Thread.currentThread().getName()+"...run.."+x--);
  17. }
  18. }
  19. }
  20. class RunnableTest
  21. {
  22. public static void main(String[]args)
  23. {
  24. Test t= new Test();

  25. Thread t1 = new Thread (t);
  26. Thread t2 = new Thread (t);
  27. Thread t3 = new Thread (t);
  28. Thread t4 = new Thread (t);
  29. t1.start();
  30. t2.start();
  31. t3.start();
  32. t4.start();


  33. }
  34. }
复制代码

作者: 郑元皓    时间: 2013-3-17 21:58
贾文泽 发表于 2013-3-17 21:49
while (true) 本来就是死循环,要怎么结束

我就是郁闷了。不知道哪里出问题。我唯一不理解的就是while(true),原来是这里的问题啊
作者: 郑元皓    时间: 2013-3-17 22:00
何仕映 发表于 2013-3-17 21:53
因为While(true)是个死循环,就算x的值打印完了。它那是在While循环里面,只是没有打印。所以听不下来。
...

我会用for的。如果我还是用while呢。要怎么结束?
作者: 郑元皓    时间: 2013-3-17 22:04
范天成 发表于 2013-3-17 21:51
楼主基础有漏洞啊

是的。本来就是哦基础。对while循环忘记的比较快。
作者: 贾文泽    时间: 2013-3-17 22:07
郑元皓 发表于 2013-3-17 22:00
我会用for的。如果我还是用while呢。要怎么结束?

在上面定义一个标记,用这个标记作为循环条件。
在循环内部改变标记,就停了
作者: 徐鸿燕    时间: 2013-3-17 22:08
  1. //加上return;就ok。
  2. while(true){
  3.         if (x > 0)
  4.                 System.out.println(Thread.currentThread().getName() + " Sela: " + x--);
  5.         else
  6.                 return;
  7. }
复制代码

作者: 郑元皓    时间: 2013-3-17 22:12
贾文泽 发表于 2013-3-17 22:07
在上面定义一个标记,用这个标记作为循环条件。
在循环内部改变标记,就停了 ...

说的好难理解啊。能代码说下吗?还有这个程序中是有几个线程?是4个还是5个?main方法的时候不是有一个主线程的吗?又跑哪里去了
作者: 郑元皓    时间: 2013-3-17 22:15
徐鸿燕 发表于 2013-3-17 22:08

尝试了下可行。但是对while(true)我还是理解不到位、不过谢了。我自个找视频在学学这个循环
作者: 何仕映    时间: 2013-3-17 22:20
本帖最后由 何仕映 于 2013-3-17 22:22 编辑
贾文泽 发表于 2013-3-17 22:07
在上面定义一个标记,用这个标记作为循环条件。
在循环内部改变标记,就停了 ...
  1. /*
  2. 需求:简单的卖票程序。
  3. 多个窗口同时买票。


  4. */
  5. class Test implements Runnable
  6. {
  7.         private int x=100;

  8.     public void run()
  9.      {

  10.                 while (x>0)
  11.                 {  
  12.                         System.out.println(Thread.currentThread().getName()+"...run.."+x--);
  13.                         --x;
  14.                 }
  15.                               
  16.         }
  17. }
  18. class RunnableTest
  19. {
  20.         public static void main(String[]args)
  21.         {
  22.                 Test t= new Test();

  23.                 Thread t1 = new Thread (t);
  24.                 Thread t2 = new Thread (t);
  25.                 Thread t3 = new Thread (t);
  26.                 Thread t4 = new Thread (t);
  27.                 t1.start();
  28.                 t2.start();
  29.                 t3.start();
  30.                 t4.start();

  31.                
  32.         }
  33. }
  34. //这个就是用While实现的

复制代码

作者: 郑元皓    时间: 2013-3-17 22:32
何仕映 发表于 2013-3-17 22:20

你这里加了 --x程序好像多减了一份x了。
作者: 何仕映    时间: 2013-3-18 07:55
郑元皓 发表于 2013-3-17 22:32
你这里加了 --x程序好像多减了一份x了。

是的,输出语句里面已经减了一个了,是多减了一个




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