黑马程序员技术交流社区

标题: 多线程Runnable代码问题 [打印本页]

作者: 汤姆纳斯    时间: 2014-6-22 13:19
标题: 多线程Runnable代码问题
本帖最后由 汤姆纳斯 于 2014-6-22 13:51 编辑
  1. class SaleTickets implements Runnable
  2. {
  3.         private int tickets=100;
  4.         public void run ()
  5.         {
  6.                 while (true)
  7.         {
  8.                         if (tickets>0)
  9.                         {
  10.                                 System.out.println(Thread.currentThread().getName()+"....."+tickets--);
  11.                         }
  12.         }
  13.         }
  14. }
  15. class TicketsDemo
  16. {
  17.         public static void main(String[] args)
  18.         {
  19.                 SaleTickets t=new SaleTickets();
  20.                 //创建线程。通过Thread类对象。
  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. }
复制代码
这段代码是毕老师视频里的,但我运行完之后程序却一直没结束,结尾一直是光标在闪,这是为什么?
作者: 黎志勇    时间: 2014-6-22 13:30
本帖最后由 黎志勇 于 2014-6-22 13:32 编辑

        public void run ()
        {
                while (true)
        {
                        if (tickets>0)
                        {
                                System.out.println(Thread.currentThread().getName()+"....."+tickets--);
                        }
        }
        }

因为你这里用了true作为while循环的判断条件,而且循环体里面也没有 break; 结束循环,也就是定义了个死循环,就算后面tickets为0后,不执行if语句,但依然无法跳出while循环,程序会一直运行而无法结束

作者: 汤姆纳斯    时间: 2014-6-22 13:38
黎志勇 发表于 2014-6-22 13:30
public void run ()
        {
                while (true)

但老师的代码也是这个啊,为什么老师的没有这样呢
作者: 黎志勇    时间: 2014-6-22 13:40
本帖最后由 黎志勇 于 2014-6-22 13:42 编辑
汤姆纳斯 发表于 2014-6-22 13:38
但老师的代码也是这个啊,为什么老师的没有这样呢

我就不记得老师是怎么的了,你再加个else语句跳出循环吧。
while (true)
{
    if (tickets>0)
    {
         System.out.println(Thread.currentThread().getName()+"....."+tickets--);
    }
    else
    {
        break;
    }

}
作者: 汤姆纳斯    时间: 2014-6-22 13:51
黎志勇 发表于 2014-6-22 13:40
我就不记得老师是怎么的了,你再加个else语句跳出循环吧。
while (true)
{

我知道了,老师的也是没结束,按了Control +C键才结束的。
作者: 黎志勇    时间: 2014-6-22 13:53
汤姆纳斯 发表于 2014-6-22 13:51
我知道了,老师的也是没结束,按了Control +C键才结束的。

嗯,我也是按ctrl+c结束了,要不CPU占用率100%。
作者: 踏雪风暴    时间: 2014-6-22 13:55
貌似问题解决了,恭喜了,我同意楼上说的,加一个else,提供跳出循环的命令,也许有其他的暂时没想到
作者: 张小军    时间: 2014-6-22 14:07
我运行的时候也有这种问题
作者: ‍杨博    时间: 2014-6-22 14:11
本帖最后由 ‍杨博 于 2014-6-22 14:13 编辑

解决了...
作者: ‍杨博    时间: 2014-6-22 14:14
本帖最后由 ‍杨博 于 2014-6-22 14:20 编辑
‍杨博 发表于 2014-6-22 14:11
解决了...

再提供一个修改方法吧

  1. while (tickets > 0) {
  2.                                 System.out.println(Thread.currentThread().getName() + "....."
  3.                                                 + tickets--);
  4.                 }
复制代码





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