java中线程 Thread和Runnable问题
麻烦前辈们看一下我这两个方法为什么次线程都没被激活而且我多次运行后发现有时候会出现:主1,次1,次2,次3,次4,主2,主3,主4。如果次线程被激活不是应该是:主1,次1...
麻烦前辈们看一下 我这两个方法 为什么 次线程都没被激活 而且我多次运行后发现 有时候会出现:主1,次1,次2,次3,次4,主2,主3,主4。 如果次线程被激活不是应该是:主1,次1,主2,次2,主3,次3,主4,次4 的吗
展开
3个回答
展开全部
你问的这个,其实有点复杂。我大致给你作以下回答。
首先,在java虚拟机中,线程是基本的调度单位,而就绪线程将抢占虚拟机资源(这里资源是CPU,因为就绪线程只需要获得CPU,便可运行)以进行运行,具体抢占的方式,要根据虚拟机的调度算法,如果两者优先级基本一样,那很可能对于用户而言,是随机的。因此来说,你所写的这个第二线程以及主线程的执行顺序,是不一定的,即,你所说的两者,都是可能发生的,也可能发生别的情况。
其次,我们可以注意到,你所写的主线程和第二线程的主要逻辑,其实都是打印一句话,你想象中,可能说两个线程会按时间片或者什么的调度进行运行,因此主次交替地执行。
但这只是及其理想的情况:即在线程的调度时,没有什么额外开销,但实际上是有的,而且相较于这种简单的程序行为,调度开销还是很大的,因此虚拟机的优化的其中一项,就是在它认为应该调度的时候,才会进行调度,所以我们看到,很有可能在次线程开始执行后,虚拟机认为完全可以将它全部执行完,再调度主线程。
这应该是你所问的答案吧……
首先,在java虚拟机中,线程是基本的调度单位,而就绪线程将抢占虚拟机资源(这里资源是CPU,因为就绪线程只需要获得CPU,便可运行)以进行运行,具体抢占的方式,要根据虚拟机的调度算法,如果两者优先级基本一样,那很可能对于用户而言,是随机的。因此来说,你所写的这个第二线程以及主线程的执行顺序,是不一定的,即,你所说的两者,都是可能发生的,也可能发生别的情况。
其次,我们可以注意到,你所写的主线程和第二线程的主要逻辑,其实都是打印一句话,你想象中,可能说两个线程会按时间片或者什么的调度进行运行,因此主次交替地执行。
但这只是及其理想的情况:即在线程的调度时,没有什么额外开销,但实际上是有的,而且相较于这种简单的程序行为,调度开销还是很大的,因此虚拟机的优化的其中一项,就是在它认为应该调度的时候,才会进行调度,所以我们看到,很有可能在次线程开始执行后,虚拟机认为完全可以将它全部执行完,再调度主线程。
这应该是你所问的答案吧……
展开全部
你的
new Thread(new SecondaryRunnable()).start();是否应该放在for()的循环体内?
更多追问追答
追问
请问下 是放在主线程的循环内 还是次线程的
追答
main方法里的那个
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
线程的运行是没有顺序而言的.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询