本帖最后由 wygsqsj 于 2015-11-20 00:12 编辑
当一个线程使用了join()方法,其他线程会抛弃cpu的执行权,当此线程结束是,其他线程才会运行,join()让线程获取到执行权直至结束。比如线程B调用到了线程A的join()方法,那么线程B就挂起,直到线程A执行完,线程B才能运行。这个地方有一个小疑惑,不知道大家有没有,就是我们在同步中,线程B执行到线程A的join方法后,线程B有没有抛锁,带着这个疑惑我做了个小实验:
打印结果为:首先主线程打印到7,然后开启所有线程,这是主线程开始跟A类线程小宏和B类线程(因为加了同步,B类线程中只有一个在打印)抢夺cpu,打印结果随机,当B类线程打印到20时,执行到了小宏的join方法,这时B类线程挂起,只剩下小宏和主线程在抢夺cpu执行权,这时候我运行了很多次,发现当B类线程被挂起时,同步外的B类线程也没有打印20以前的数值,我推断虽然join方法让线程挂起了,但是并没有抛弃同步中的锁,所以每次打印结果都是B类线程等待小宏打印完”end“后继续打印剩下的内容,执行完同步中内容然后线程结束。当小宏”end“后就剩下了B类线程和主线程抢夺cpu,这时候打印结果就不用多说了。 |