本帖最后由 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、在只有主线程和一个自定义线程时,是不是主线程优先级高一点,会执行多一点呢?
感谢你提出的问题,我今天也复习了一下多线程,基础还是不好啊,一起学习,一起进步!!
|