黑马程序员技术交流社区

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

作者: 焦健    时间: 2012-12-24 14:21
标题: 多线程问题
本帖最后由 焦健 于 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必须手动终止吗。
作者: 马志军    时间: 2012-12-25 08:12
x静态是指class Piao extends Thread的情况,创建多个piao对象,每个对象都有独立的x,所以要写成静态以便共享那100张票
但用implements方式时,只有一个Piao对象,作为参数传递给多线程,因为只有一个,所以用不着静态
作者: 黄锦成    时间: 2012-12-25 09:12
第一次运行,电脑死机了。然后看了代码,怪不得
我把你的代码修改了一下,供参考

/*买票
* 有票数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 12:10
黄锦成 发表于 2012-12-25 09:12
第一次运行,电脑死机了。然后看了代码,怪不得
我把你的代码修改了一下,供参考

哦,我明白了,谢啦啊




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