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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class demo_2 implements Runnable
{
        int ticket =60;
        Object obj=        new Object();
                public void run()
                {
               for(;ticket>0;ticket--)
                        {
        System.out.println(Thread.currentThread().getName()+"---"+ticket+"号票!");
                        }
                                }
                                }
                }
                }
public class Demo2 {
        public static void main(String[] args) {
         demo_2 d1=new demo_2();
     Thread t1=new Thread(d1);
     Thread t2=new Thread(d1);
     Thread t3=new Thread(d1);
     t1.start();
     t2.start();
     t3.start();
        }
}
这段代码,每次总会出现一次重复的。比如有时候会出现3个60,有时候会出现3个57等等。其他的又都没问题。

6 个回复

倒序浏览
你把变量ticket前面加上修饰符"private和static"(也就是private static int ticket=60;)再试试看是否可行?加上static就相当于让所有的对象共享这个资源,也就不用每个对象都有一套(因为你创建了三个Thread类的对象)自己的资源了,它们共同“抢夺cpu里的这60个整数”这样就不会打印重复数据了。另外,加关键字“private”的作用相信你自己明白了,我就不再赘述。下面是我们今天刚讲的案例,跟你这是一样的(我真怀疑你是我们一个班的同学,时间有点巧,呵呵)。
回复 使用道具 举报
本帖最后由 依然超级赛亚人 于 2014-7-18 23:04 编辑

public class Ticket extends Thread { //这个是定义的卖票的Ticket类(编译时可能会有关于public的报错,如果有,删除public就行了)
        // 定义100张
        private static int tickets = 100;

        public Ticket() {
        }

        public Ticket(String name) {
                super(name);
        }

        @Override
        public void run() {
               
                while (true) {
                        if (tickets > 0) {
                                System.out.println(Thread.currentThread().getName() + "正在出售第"
                                                + (tickets--) + "张票");
                        }
                }
        }
}


//这个是测试类
public class TicketDemo {
        public static void main(String[] args) {
                Ticket t1 = new Ticket("窗口1");
                Ticket t2 = new Ticket("窗口2");
                Ticket t3 = new Ticket("窗口3");
                Ticket t4 = new Ticket("窗口4");

                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}


回复 使用道具 举报
依然超级赛亚人 发表于 2014-7-18 22:55
你把变量ticket前面加上修饰符"private和static"(也就是private static int ticket=60;)再试试看是否可行 ...

好吧,你说的加static这个方法,我知道啊。不过一般定义变量不建议用这个的啊,生命周期太长了。
回复 使用道具 举报
奋斗2014 发表于 2014-7-18 23:02
好吧,你说的加static这个方法,我知道啊。不过一般定义变量不建议用这个的啊,生命周期太长了。 ...

哦,对啊,今天也讲过这个问题,那你看下面改正后的这一套代码:
public class Ticket implements Runnable {
        private int tickets = 100;

        @Override
        public void run() {
               
                while (true) {
                        if (tickets > 0) {
                                System.out.println(Thread.currentThread().getName() + "正在出售第"
                                                + (tickets--) + "张票");
                        }
                }
        }

}

public class TicketDemo {
        public static void main(String[] args) {
                Ticket t = new Ticket();

                Thread t1 = new Thread(t, "窗口1");
                Thread t2 = new Thread(t, "窗口2");
                Thread t3 = new Thread(t, "窗口3");
                Thread t4 = new Thread(t, "窗口4");

                // 每一个线程对象都去掉用了run()方法
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}

>>>我现在的水平还很有限,所以暂时只能做到这些,见谅!
回复 使用道具 举报
怎么没见你的锁嘞,obj都写了!!线程处于堵塞状态,执行完没有减就切换到下一个
回复 使用道具 举报
人心如水 发表于 2014-7-18 23:39
怎么没见你的锁嘞,obj都写了!!线程处于堵塞状态,执行完没有减就切换到下一个 ...

跟那个无关,锁那一块被我注释了,没贴出来。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马