黑马程序员技术交流社区

标题: 关于匿名内部类与多线程 [打印本页]

作者: zl78365336    时间: 2013-11-10 15:06
标题: 关于匿名内部类与多线程
本帖最后由 zl78365336 于 2013-11-10 17:58 编辑

请问各位师兄:
       《卖票的题》平常的方式:100张票售卖是正常的。
//<??可是用匿名内部类的方式却是售卖了400张票,麻烦各位师兄给点指导,谢谢!>
                 class Ticket  implements Runnable{
        private int tick = 100;
        public void run(){
                while(true){
                        if(tick>0)
                                System.out.println(Thread.currentThread().getName()+" sale: "+tick--);
                }
        }
}

public class TicketTest {
        public static void main(String[] args) {               
                Ticket t = new Ticket();
               
                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);
                Thread t3 = new Thread(t);
                Thread t4 = new Thread(t);
               
                t1.start();
                t2.start();
                t3.start();
                t4.start();*/
        }
}

//用匿名内部类的方式
public class TicketTest {
        public static void main(String[] args) {
                Runnable t = new Runnable(){
                        public void run(){
                                int tick = 100;
                                while(true){
                                        if(tick>0)
                                                System.out.println(Thread.currentThread().getName()+" zz_sale: "+tick--);
                                }
                        }
                };
                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);
                Thread t3 = new Thread(t);
                Thread t4 = new Thread(t);
               
                t1.start();
                t2.start();
                t3.start();
                t4.start();



作者: 零下五度的水    时间: 2013-11-10 15:25
目测你用不用匿名类卖出的都是400张吧
tick 要设成静态全局变量
作者: wjj410830911    时间: 2013-11-10 15:55
本帖最后由 wjj410830911 于 2013-11-10 15:56 编辑
public class 测试2 {
    public static void main(String[] args) {
            Runnable t = new Runnable(){
                    private  int tick = 100;         //将tick调成成员方法 并私有
                    public void run(){
                          
                            while(true){
                                    if(tick>0)
                                            System.out.println(Thread.currentThread().getName()+" zz_sale: "+tick--);
                            }
                    }
            };
            Thread t1 = new Thread(t);
            Thread t2 = new Thread(t);
            Thread t3 = new Thread(t);
            Thread t4 = new Thread(t);
            
            t1.start();
            t2.start();
            t3.start();
            t4.start();
            }
    }

这个是正确的    测试证明   tick 不用设成静态全局变量 也是可以的   
  第2个匿名内部内 错在tick是局部变量了  写在run()方法下   应该是成员变量并且私有private

同时 小建议  你应该在判断下 把JAVA虚拟机在票卖完时关掉  
作者: zl78365336    时间: 2013-11-10 16:11
对,因为main()是static的,所以不用设静态

作者: zl78365336    时间: 2013-11-10 16:33
请问这个程序,关JVM的具体代码是什么?
作者: wjj410830911    时间: 2013-11-10 16:48
本帖最后由 wjj410830911 于 2013-11-10 16:50 编辑
  1. while(true){
  2.                                     if(tick <= 0){   //添加一个判断   当票数等于0或小于0时   break退出
  3.                                             break;
  4.                                     }
  5.                                             System.out.println(Thread.currentThread().getName()+" zz_sale: "+tick--);
  6.                             }
复制代码

作者: 黄炳期    时间: 2013-11-10 17:00
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html

作者: zl78365336    时间: 2013-11-10 17:57
       了解




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