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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

关于多线程问题的解答,有同学看了关毕老师的多线程的那一节课程后,提出以下问题 ,下面是他对原题的提出的问题,我想和他有同样问题的同学可能还很多吧,所以我特意写个帖子,希望可以帮助到大家,也是我对论坛的小小贡献吧!!
下面是他的困惑: 关毕老师视频138中讲到一个例子,为了验证同步函数的锁是this使用了以下代码
class Ticket implements Runnable// extends Thread
{ private int tick = 1000; Object obj = new Object();
      boolean flag = true;
     void run()
        {
                if (flag)                                                                                                //当flag=true时,线程执行同步代码块
                        while(true)
                        {
                                synchronized(obj)
                                {
                                        if (tick>0)
                                        {
                                                try{Thread.sleep(10);}catch(Exception e){}//强制线程睡眠,使运行出现溢出错误
                                                System.out.println(Thread.currentThread().getName()+" ...code...:"+tick--);
                                        }
                                }
                    }
                else                                                                                                        //当flag=false时,线程执行同步函数
                        while (true)
                        {
                                show();
                        }
        }

        public synchronized void show()
        {
                if (tick>0)
                {
                        try{Thread.sleep(10);}catch(Exception e){}//强制线程睡眠,使运行出现溢出错误
                        System.out.println(Thread.currentThread().getName()+" ...show:"+tick--);
                }
        }
}

class ThisLockDemo
{
        public static void main(String[] args)
        {
                Ticket t = new Ticket();
               
                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);

                t1.start();
                t.flag = false;       //切换flag为false
                try{Thread.sleep(10);}catch(Exception e){}
                t2.start();

        }
}
171442s7s8fk2fvuyz2q95.png.thumb.jpg

结果如上图,大致就是让两个线程各自运行run()方法中flag=true与flag=false的部分。
我的疑惑就是,为什么thread-0能一直运行flag=true时的同步代码块?如果thread-1已经运行了,代表flag已经被改为false了吧,那么thread-0再运行run()方法时应该也运行false的部分啊?还是我哪里理解错了……
》他的问题到此结束。
我的解答  对这一个问题我想他没弄清多线程的运行过程,看看下面这张图就能很好的理解了,当第一个线程执行着,突然cpu把资源分给第二个线程后,第二个线程的状态为Runing,第一个线程会进入Runable,从图可以看出Runable在start后面,也就是说线程的start只会启动一次,它里面的数据一直是start启动时的数据(但run方法里数据会随着变化而变化),cpu让线程暂停会让线程进入Runing状态。而不是从新开始,除非这个线程执行完了,或抛出异常了,那他就真的停止了,在开始就是从start开了。(你从显示的结果也能看出来,如果他从每次让出资源时后都从start开始的话,那么你会看到显示的数都是从100开始到一个数,然后后面又是从100开始,因为start开始就是从原始数据开始。你从结果看显然不是这种情况,他显示的数据都是依次从100到最后,好像这里面有个东西记录着执行到哪了,这说明没真正的停止而是进入Runing状态了,等第二个线程让出资源,然后他会在进入Runing状态)。

143411ngpi4v54sggkd7y0.png.thumb.jpg
毕老师课程老师课程关毕老师课程


4 个回复

倒序浏览
回复 使用道具 举报

多线程啊
回复 使用道具 举报

多线程啊
回复 使用道具 举报
赞一个            
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马