| 本帖最后由 miedongdong 于 2014-4-12 18:52 编辑 
 
 看到这个问题,我也不是很懂,真惨!下午自己动手试了一下,感觉有点懂了, 我根据你的程序来说一下我的想法,如果有不对的请指正: 主线程和自定义线程在运行的时候都会抢夺cpu执行权,这里就会牵涉到输出结果的问题,两个方法里面都有sleep方法,只要其中一个线程执行了sleep方法,那么另一个线程就会启动。在你的编译结果中,就是主线程执行show2(),此时把2赋值给栈中的 a (此时还没输出a),先执行sleep(),此时自定义线程就会拿到执行权,show1()就把栈中的a修改成1,当睡眠100毫秒期间,show2中的打印语句执行,可是此时栈中只有a=1,所以打印出来1,show1中打印的1也是如此。 
 执行流程如下:main-->show2()-->a=2-->sleep(20)-->show1()-->a=1-->sleep(100)-->show2{sop(1)}-->show1{sop(1)}; 
 我根据你的程序做了如下修改: 
 
 复制代码import java.util.*;
class ThreadDemo implements Runnable 
{
        public int a ;
        public  void show1()throws Exception
        {
                a = 1;
                Thread.sleep(100);
                System.out.println("show1....."+a);
        }
        
        public  void show2()throws Exception
        {
                System.out.println("show......"+a);//只是增加这行代码
                a = 2;
                Thread.sleep(20);
                System.out.println("show2....."+a);
        }
        public void run()
        {
                try
                {
                        show1();
                }
                catch (Exception e)
                {
                }
                
        }
        
}
class client
{
        public static void main(String[] args) throws Exception
        {
                ThreadDemo td = new ThreadDemo();
                Thread t = new Thread(td);
                t.start();
                td.show2();
        }
}
打印结果如下:(我比较幸运,一下子就能出现两个不同的效果)
E:\Study\1-today\1-javados\0410>javac ThreadDemo.java
E:\Study\1-today\1-javados\0410>java client
show......0
show2.....2
show1.....2
E:\Study\1-today\1-javados\0410>java client
show......1
show2.....2
show1.....2
 
 
 
 跟你的程序只是修改了一行,怎么会有这两个效果? 1、说明一下两个打印结果中的第一行不同结果的原因:之前说过主线程和自定义线程会抢夺执行权,那么第一个打印结果就是主线程先执行show2方法,一开始a是默认为0,所以第一个打印方法打印的是0,那么第二个打印结果为啥会是1呢?那就是自定义线程先执行show1(),此时刚把1赋值给a后,就立刻给主线程抢去了执行权,此时栈中的a的值为1,所以打印1。 2、至于为啥两个结果的最后两个都是打印2,我暂时还没找到依据,只是有一个猜测,希望哪位同学能帮忙解析一下,在此谢谢了。我的猜测是:主线程操作的方法是后面,按照执行顺序来看的话,就是自定义线程先睡眠,所以主线程中的a=2会覆盖之前的值,打印结果就是2。 
 
 但是我也有产生了疑问,希望有同学能帮忙解答一下:   1、为什么在修改后的程序中,sleep()之前主线程都会抢夺执行权,而不会提前sleep呢?而楼主的线程就是主线程先执行sleep()呢 2、在只有主线程和一个自定义线程时,是不是主线程优先级高一点,会执行多一点呢? 
 
 感谢你提出的问题,我今天也复习了一下多线程,基础还是不好啊,一起学习,一起进步!!
 |