黑马程序员技术交流社区

标题: 关于多线程变量的问题 [打印本页]

作者: 单凯    时间: 2013-8-16 21:24
标题: 关于多线程变量的问题
本帖最后由 单凯 于 2013-8-16 21:41 编辑

public class Ticket extends Thread {
        // 定义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(getName() + "正在出售第" + (tickets--) + "张票");
                        }
                }
        }
}
public class TicketTest {
        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();
        }
}

-----------------------------------------------------------------------
public class Ticket implements Runnable {
        // 定义100张票
        private int tickets = 100;

        @Override
        public void run() {
                // 为了模拟次数足够多,用死循环
                while (true) {
                        // 判断如果有票,就卖出票
                        if (tickets > 0) {
                                System.out.println(Thread.currentThread().getName() + "正在出售第"
                                                + (tickets--) + "张票");
                        }
                }
        }

}
public class TicketTest {
        public static void main(String[] args) {
                // 创建实现了Runnable接口的子类对象
                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");

                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}
-------------------------------------------------
public class Ticket extends Thread {
        // 定义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(getName() + "正在出售第" + (tickets--) + "张票");
                        }
                }
        }
}
public class TicketTest {
        public static void main(String[] args) {
                // 创建四个线程对象
                Ticket t1 = new Ticket("窗口1");
               

                t1.start();
                t1.start();
                t1.start();
                t1.start();
        }
}
----------------------------------------------
第二个程序和第三个程序有什么不同吗?第三个程序是使用的一个对象,会出现异常,但是第二个程序使用的也是同一个对象Ticket,如果是通过Thread()方法有重新生成了新的对象
那么private int tickets 应该就是static的啊,被这四个共享才可以是100,但问题是不定义成静态的同样可以被共享,想不明白


作者: yan    时间: 2013-8-16 21:29
第二个程序是建立了一个Ticket对象,下面是基于它使用Thread建立了关于它的四个线程,因为只建立了一个Ticket对象,所以只声明了一次票数,因此这四个线程共享这个变量。
第三个是因为每建立一个对象就会声明一次票数,在主函数中声明了四个关于Ticket的线程,如果不设置为static就会有400张票,因此需要设置为静态让其成为共享变量,这样,这四个线程对象就会共享这一百张票。
自己的理解,希望能帮助到你。
作者: yan    时间: 2013-8-16 21:37
不好意思看错了,下面那个第三个程序应该改成第一个
第三个程序不能多次启动,因为已经创建并Start()了,再次创建就会异常,已经运行的程序不需要再次开启,如果想要实现一个对象开启多个线程对象就可以使用第二个程序
作者: 单凯    时间: 2013-8-16 21:41
yan 发表于 2013-8-16 21:37
不好意思看错了,下面那个第三个程序应该改成第一个
第三个程序不能多次启动,因为已经创建并Start()了, ...

嗯,谢谢

作者: 焦允    时间: 2013-8-16 22:23
第二个程序是多线程操作,第三个不是多线程操作(只有一个主线程在运行),第三个相当于只是Ticket类的对象调用自身的run方法4次,而且只有第一调用的时候对变量tickets存数据进行了操作,后面的3次调用用,由于进行条件判断时tickets > 0的条件不满足,后面的操作就不会再执行了。
还有,一个Java文件里面只能有一个public修饰的类,并且与文件名相同,所以上面三个程序执行的时候都会报错的。




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