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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 只想要一盏灯 中级黑马   /  2013-10-29 19:49  /  1379 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Ticket implements Runnable//实现Runnable的接口
{
        private int tick = 100;//定义票数为100张
        public void run()//覆盖接口中的run方法
        {
                while(true)
                {        if (tick >0)
                        {
                           System.out.println(Thread.currentThread().getName()+"..nima.."+ tick--);
                        }        
                }
        }
}

class ThreadTest02
{
        public static void main(String[] args)
        {
                Ticket t = new Ticket();//创建Ticket类中的对象

                Thread t1 = new Thread(t);//创建线程,并将Ticket类中的对象引用到线程中
                Thread t2 = new Thread(t);
                Thread t3 = new Thread(t);
                Thread t4 = new Thread(t);
               
                t1.start();//启动线程
                t2.start();
                t3.start();
                t4.start();
        }
}

这个是毕老师视频中的那个例题,我自己写了一篇后,发现运行后,不自动结束,要ctrl+c 才能结束,后来我把毕老师的源代码复制进来,发现还是同样的结果,求解。
然后能不能跟我说说为什么我用for循环,不行呢?
System.out.println(Thread.currentThread().getName()+"..nima.."+ tick--);这句话中的tick-- ;可以放到其他位置吗?

11 个回复

倒序浏览
不好意思,这个本来就是不会自动结束的,刚刚看下一个视频才发现。麻烦大家解释下下面的两个问题了。
回复 使用道具 举报
这是无限循环,while(true),这样做的母的是想让程序运行的时间长一些,可以更早更好的发现问题。如果用for循环时间过短,不易发现问题。

class Ticket implements Runnable//实现Runnable的接口
{
        private int tick = 100;//定义票数为100张
        public void run()//覆盖接口中的run方法
        {
               for(int x=1;x<=100;x++)
                {        if (tick >0)
                        {
                           System.out.println(Thread.currentThread().getName()+"..nima..");
                                                   tick--;
                                                   x++;
                        }  
                                               
                                                if(x==100)
                                                        break;
                }
        }
}

class ThreadTest02
{
        public static void main(String[] args)
        {
                Ticket t = new Ticket();//创建Ticket类中的对象

                Thread t1 = new Thread(t);//创建线程,并将Ticket类中的对象引用到线程中
                Thread t2 = new Thread(t);
                Thread t3 = new Thread(t);
                Thread t4 = new Thread(t);
               
                t1.start();//启动线程
                t2.start();
                t3.start();
                t4.start();
        }
}

点评

有心了~  发表于 2013-10-29 20:23
回复 使用道具 举报
for循环可以啊 for( ;tick>=0; )
tick--可以放到上面那个for 的第三格
回复 使用道具 举报
既然已经明白,那就帮你修改主题了哈{:soso_e113:}
回复 使用道具 举报
靓仔 发表于 2013-10-29 20:11
这是无限循环,while(true),这样做的母的是想让程序运行的时间长一些,可以更早更好的发现问题。如果用for ...

额,原来是这样,for的参数我写错了,thanks
回复 使用道具 举报
可以用for循环啊,只是电脑运行速度比较快,不容易暴露可能出现的问题。你可以吧循环条件设置大一点,比如弄个几千。或者让线程运行慢点,就是让线程休息一会,用sleep()方法;这样就可能出现可能 的错误,不行就多运行几次,总会有想要的结果的。
tick--;可以放其它地方,只要在while循环语句中就行,设置tick--是为了当票数为零的时候不在输出,换位置只要不影响这个语句就行....
回复 使用道具 举报
靓仔 发表于 2013-10-29 20:11
这是无限循环,while(true),这样做的母的是想让程序运行的时间长一些,可以更早更好的发现问题。如果用for ...

这个程序要S.o.p后面是应该加 tick 还是 x 啊?加了都不对额
回复 使用道具 举报
靓仔 中级黑马 2013-10-29 20:51:52
9#
你复制运行一下不就知道了
回复 使用道具 举报
靓仔 发表于 2013-10-29 20:51
你复制运行一下不就知道了

我两个都试了,都不行额!加x和tick都出现了四个100
回复 使用道具 举报
靓仔 中级黑马 2013-10-29 21:44:27
11#
class Ticket implements Runnable//实现Runnable的接口
{
        private int tick = 100;//定义票数为100张
        public void run()//覆盖接口中的run方法
        {
               for(int x=1;x<=100;x++)
                {        if (tick >0)
                        {
                           System.out.println(Thread.currentThread().getName()+"..nima..");
                                                   tick--;
                                                   x++;
                        }  

                                                if(x==100)
                                                        break;
                }
        }
}

class ThreadTest02
{
        public static void main(String[] args)
        {
                Ticket t = new Ticket();//创建Ticket类中的对象

                Thread t1 = new Thread(t);//创建线程,并将Ticket类中的对象引用到线程中
                Thread t2 = new Thread(t);
                Thread t3 = new Thread(t);
                Thread t4 = new Thread(t);

                t1.start();//启动线程
                t2.start();
                t3.start();
                t4.start();
        }
}

2.jpg (54.24 KB, 下载次数: 39)

2.jpg
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马