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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 单凯 中级黑马   /  2013-8-16 21:24  /  1402 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 单凯 于 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,但问题是不定义成静态的同样可以被共享,想不明白

评分

参与人数 1技术分 +1 收起 理由
以防万一 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
第二个程序是建立了一个Ticket对象,下面是基于它使用Thread建立了关于它的四个线程,因为只建立了一个Ticket对象,所以只声明了一次票数,因此这四个线程共享这个变量。
第三个是因为每建立一个对象就会声明一次票数,在主函数中声明了四个关于Ticket的线程,如果不设置为static就会有400张票,因此需要设置为静态让其成为共享变量,这样,这四个线程对象就会共享这一百张票。
自己的理解,希望能帮助到你。
回复 使用道具 举报
不好意思看错了,下面那个第三个程序应该改成第一个
第三个程序不能多次启动,因为已经创建并Start()了,再次创建就会异常,已经运行的程序不需要再次开启,如果想要实现一个对象开启多个线程对象就可以使用第二个程序

评分

参与人数 1技术分 +1 收起 理由
以防万一 + 1 如果附上代码,效果会更好更清晰.

查看全部评分

回复 使用道具 举报
yan 发表于 2013-8-16 21:37
不好意思看错了,下面那个第三个程序应该改成第一个
第三个程序不能多次启动,因为已经创建并Start()了, ...

嗯,谢谢
回复 使用道具 举报
第二个程序是多线程操作,第三个不是多线程操作(只有一个主线程在运行),第三个相当于只是Ticket类的对象调用自身的run方法4次,而且只有第一调用的时候对变量tickets存数据进行了操作,后面的3次调用用,由于进行条件判断时tickets > 0的条件不满足,后面的操作就不会再执行了。
还有,一个Java文件里面只能有一个public修饰的类,并且与文件名相同,所以上面三个程序执行的时候都会报错的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马