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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 焦健 高级黑马   /  2012-12-24 14:21  /  1604 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 焦健 于 2012-12-25 12:11 编辑

使用eclipse运行几次多线程售票代码,本本热的几乎可以煎熟一锅鸡蛋,上代码
/*买票
* 有票数100张,分两个窗口售票
* 两个窗口操作同一个资源,出现县城安全问题,怎么解决呢,
*
* */
package cn.start;
class Piao implements Runnable{
        private int x=100;//这里,毕老师说过静态后可以多线程共享数据,我试的不用静态也没有问题啊。这里有必要静态吗?
        Object o=new Object();
        public void run(){
                        while(true)
                        {
                                if(x>0){
                                        try{Thread.sleep(10);}catch(Exception e){}
                                System.out.println(Thread.currentThread().getName()+"----------"+x--);
                                }
                        }
        }        
}
public class Duo4 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO 自动生成的方法存根
                Piao p=new Piao();
                new Thread(p).start();
                new Thread(p).start();
        }

}
对于不能自动结束的程序eclipse必须手动终止吗。

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1

查看全部评分

3 个回复

倒序浏览
x静态是指class Piao extends Thread的情况,创建多个piao对象,每个对象都有独立的x,所以要写成静态以便共享那100张票
但用implements方式时,只有一个Piao对象,作为参数传递给多线程,因为只有一个,所以用不着静态
回复 使用道具 举报
第一次运行,电脑死机了。然后看了代码,怪不得
我把你的代码修改了一下,供参考

/*买票
* 有票数100张,分两个窗口售票
* 两个窗口操作同一个资源,出现县城安全问题,怎么解决呢,
*
* */

class Piao implements Runnable{
        private int x=100;//这里,毕老师说过静态后可以多线程共享数据,我试的不用静态也没有问题啊。这里有必要静态吗?
        Object o=new Object();
        public void run(){
                                                boolean flag=true;//初始化为true,循环条件                        while(flag)
                        {
                                synchronized(Piao.class)//同步
                                                                {
                                                                        if(x>0){
                                        try{Thread.sleep(10);}catch(Exception e){}
                                                                                System.out.println(Thread.currentThread().getName()+"----------"+x--);
                                                                        }else{
                                                                                flag=false;//没票的时候跳出循环
                                                                        }
                                                                }
                        }
        }        
}
public class Test {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO 自动生成的方法存根
                Piao p=new Piao();
                new Thread(p).start();
                new Thread(p).start();
        }

}
回复 使用道具 举报
黄锦成 发表于 2012-12-25 09:12
第一次运行,电脑死机了。然后看了代码,怪不得
我把你的代码修改了一下,供参考

哦,我明白了,谢啦啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马