黑马程序员技术交流社区

标题: 【已解决】多线程的问题-求解 [打印本页]

作者: 张吉日    时间: 2012-8-10 13:26
标题: 【已解决】多线程的问题-求解
本帖最后由 张吉日 于 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();
        }
}

作者: 周世阳    时间: 2012-8-10 13:35
能实现多线程输出,只不过多数情况只能看到一个线程,我试了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){}之前,就可以看到多线程输出了
作者: 戎石锁    时间: 2012-8-10 13:38
/*
首先恭喜你 你这个代码没有问题
只是票数有点少

*/


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:45
周世阳 发表于 2012-8-10 13:35
能实现多线程输出,只不过多数情况只能看到一个线程,我试了10次才看到一次是Thread-1和Thread-4
这是因为 ...

还没学到锁啊~ 迷糊
作者: 张吉日    时间: 2012-8-10 13:48
周世阳 发表于 2012-8-10 13:35
能实现多线程输出,只不过多数情况只能看到一个线程,我试了10次才看到一次是Thread-1和Thread-4
这是因为 ...

谢谢你 换了位置之后编程多线程了




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