首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

这个线程为什么和书下说的不一致?

2012-12-18 
这个线程为什么和书上说的不一致?~class ThreadSale implements Runnable{//创建Runnable接口类private in

这个线程为什么和书上说的不一致?~

class ThreadSale implements Runnable{       //创建Runnable接口类
private int tickets = 10;                 //私有变量tickets 代表机票数,是共享数据
public void run(){
while(true){
if(tickets > 0)
   System.out.println(Thread.currentThread().getName() + "售机票第"+tickets+"号");
else
   System.exit(0);
}
}
}
public class RunnableShare{              //在主类里创建并启动3个线程对象
public static void main(String[] args){
ThreadSale t = new ThreadSale();     //用此对象t作为参数创建3个线程  第二个对象是线程名
Thread t1 = new Thread(t,"第1售票窗口");
Thread t2 = new Thread(t,"第2售票窗口");
Thread t3 = new Thread(t,"第3售票窗口");
t1.start();
t2.start();
t3.start();
}
}






书上的结果是3个窗口共享10张机票,不会重复卖,但是我自己调试的结果 竟然是一个无限的输出,不停的输出~~~~囧~!!求大大看看代码~!
[最优解释]

 System.out.println(Thread.currentThread().getName() + "售机票第"+tickets+"号"); 

改成

 System.out.println(Thread.currentThread().getName() + "售机票第"+(tickets--)+"号"); 

[其他解释]
原因就和1楼所说的,没有tickets--肯定死循环,你出现这种错误还不知道原因的话说明你对这个程序了解还不透彻。多看看。
另外你测试一下结果,10个有可能太少,改成100   或者1000试一试会不会出现票号相同的问题。
这里个人感觉有可能会出现,因为数据没有加锁。
[其他解释]
class ThreadSale implements Runnable{       //创建Runnable接口类
    private int tickets = 10;                 //私有变量tickets 代表机票数,是共                                                 //享数据
    public void run()
    {
        while(true)
{
tickets--;//这儿添加一个自减运算,只要有一个窗口售出一张票,                            总数就减少一张,并且其他窗口不能在售这张票
            if(tickets > 0)
               System.out.println(Thread.currentThread().getName() + "售机票第"+tickets+"号");
            else
               System.exit(0);
            }
        }
    }
    public class RunnableShare
{              //在主类里创建并启动3个线程对象
        public static void main(String[] args)


{
            ThreadSale t = new ThreadSale();     //用此对象t作为参数创建3个线程  第二个对象是线程名
            Thread t1 = new Thread(t,"第1售票窗口");
            Thread t2 = new Thread(t,"第2售票窗口");
            Thread t3 = new Thread(t,"第3售票窗口");
            t1.start();
            t2.start();
            t3.start();
            }
        }
控制变量的变化,一张票只能售一次,只要售出一张,总数就减一张,
[其他解释]
需要控制这个tickets变量·· 
[其他解释]
你的那个循环是死循环啦...
[其他解释]
System.out.println(Thread.currentThread().getName() + "售机票第"+(tickets--)+"号");
看好,每卖一张票,票数要减去一张tickets--
[其他解释]
谢谢楼上各位的回答,我改了一下,然后也把数量改大了,然后应该就没问题了~

Java 的习惯还是没有形成~! 思维不好,哎  只有加油了

热点排行