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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张吉日 中级黑马   /  2012-8-10 13:26  /  1708 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张吉日 于 2012-8-10 14:30 编辑

/*
        为什么我运行这个代码,在cmd上面出现的都是单线程Thread-0的从100-1,为什么不能实现多线程输出
*/
class  Ticket implements Runnable //实现接口
{
        private int tick = 100;
        Object obj = new Object();
        public void run()
        {
                while (true)
                {
                        synchronized(obj)//线程保护程序代码....
                        {
                                if (tick>0)
                                {
                                        try{Thread.sleep(10);}catch(Exception e){}
                                        System.out.println(Thread.currentThread().getName()+"sale:"+ tick--);
                                }
                        }
                }
        }
}
class  TicketDemo2
{
        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();
        }
}

4 个回复

倒序浏览
能实现多线程输出,只不过多数情况只能看到一个线程,我试了10次才看到一次是Thread-1和Thread-4
这是因为你把
try{Thread.sleep(10);}catch(Exception e){}
放进了锁中,所以当线程运行到sleep(10)的时候,休息10毫秒,可是他还在同步代码块中,锁也还在这个线程上,这时候CPU的执行权虽然交到了其他线程里,但其他线程没有锁,无法进入同步代码快,之前的进程醒来会继续执行,如此下去就很难看到多线程执行,而是基本上一个线程完成的
将try{Thread.sleep(10);}catch(Exception e){}放入到while中的synchronized(obj){}之前,就可以看到多线程输出了
回复 使用道具 举报
/*
首先恭喜你 你这个代码没有问题
只是票数有点少

*/


class  Ticket implements Runnable //实现接口
{
        private int tick = 100; //这里可以改成400或者更多就可以了        
Object obj = new Object();
        public void run()
        {
                while (true)
                {
                        synchronized(obj)//线程保护程序代码....
                        {
                                if (tick>0)
                                {
                                        try{Thread.sleep(10);}catch(Exception e){}
                                        System.out.println(Thread.currentThread().getName()+"sale:"+ tick--);
                                }
                        }
                }
        }
}
class  TicketDemo2
{
        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();
        }
}
回复 使用道具 举报
周世阳 发表于 2012-8-10 13:35
能实现多线程输出,只不过多数情况只能看到一个线程,我试了10次才看到一次是Thread-1和Thread-4
这是因为 ...

还没学到锁啊~ 迷糊
回复 使用道具 举报
周世阳 发表于 2012-8-10 13:35
能实现多线程输出,只不过多数情况只能看到一个线程,我试了10次才看到一次是Thread-1和Thread-4
这是因为 ...

谢谢你 换了位置之后编程多线程了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马