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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 葛奎 中级黑马   /  2012-6-18 19:34  /  1407 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class sellTicket extends Thread
{
    private  static  int tick=100;
    public void run()
    {
        Object obj=new Object();
        while(true)
        {
            synchronized(obj)
            {
                if(tick>0)
                {//像毕老师说的,当Thread-0进来时,其他的线程就进不来了.依次类推
                    try{Thread.sleep(10);} catch(Exception e){}//也就是说这种情况下不可能出现0,-1,-2的情况.
                                                            //但是执行到这句话时候,还是出现了0,-1的情况.把这句去掉就正确了 这是为什么啊?
                    System.out.println(getName()+"  "+tick--);
                }
            }
        }
    }
}
class ThreadTest2
{
    public static void main(String[] args)
    {
        sellTicket st=new sellTicket();
        sellTicket st2=new sellTicket();
        sellTicket st3=new sellTicket();
        st.start();
        st2.start();
        st3.start();
   
    }
}




3 个回复

倒序浏览
本帖最后由 黑马—陈磊 于 2012-6-18 20:16 编辑

可以这样修改:
class sellTicket implements Runnable
{
    private  static  int tick=100;
    Object obj=new Object();         //run方法应放在外边(你的放在了run方法里),不然每次执行run方法都会new一个obj对象
    public void run()
    {      
        while(true)
        {
            synchronized(obj)
            {
                if(tick>0)
                {
                    try{Thread.sleep(10);} catch(Exception e){}
                                                            
                    System.out.println(Thread.currentThread().getName()+"  "+tick--);
                }
            }
        }
    }
}
class Test
{
    public static void main(String[] args)
    {
         sellTicket st=new sellTicket();      
//        sellTicket st2=new sellTicket();
//        sellTicket st3=new sellTicket();
//        st.start();
//        st2.start();
//        st3.start();
            
        Thread st1=new Thread(st);      
        Thread st2=new Thread(st);
        Thread st3=new Thread(st);
        st1.start();
        st2.start();
        st3.start();
    }
    }

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这里就要讲到创建多线程的第二种方式了:
实现Runable接口:此种方式用于多个线程执行同一资源. 程序已更改,请楼主参考:
class sellTicket implements Runnable {
        private int tick = 1000;

        Object obj = new Object();
        public void run() {
                while (true) {
                        synchronized (obj) {
                                if (tick > 0) {// 像毕老师说的,当Thread-0进来时,其他的线程就进不来了.依次类推
                                        try {
                                                Thread.sleep(10);
                                        } catch (Exception e) {
                                        }// 也就是说这种情况下不可能出现0,-1,-2的情况.
                                                // 但是执行到这句话时候,还是出现了0,-1的情况.把这句去掉就正确了 这是为什么啊?
                                        System.out.println(Thread.currentThread().getName() + "  " + tick--);
                                }
                        }
                }
        }
}

class Demo1{
        public static void main(String[] args) {
                sellTicket st = new sellTicket();
               
                Thread t1 = new Thread(st);
                Thread t2 = new Thread(st);
                Thread t3 = new Thread(st);
               
                t1.start();
                t2.start();
                t3.start();

        }
}

回复 使用道具 举报
首先这句代码
Object obj = new Object();应该放在run()方法外边,另外像这种具有共享数据的多线程应该使用继承Runnable接口
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马