我在一个程序中自己主动设的有三个线程,每个类都用了runnable接口,优先级默认,为5,所以一个类就是一个线程,
假定A类中线程名为A thread,A类中的run如下:
public void run() {
while (!complete) {f(x,y)//这个运算大概要花200ms时间,相对来说执行时间长一些
try {Thread.sleep(40);
} catch (InterruptedException e) {}
}
}
B类中的run如下:
public void run() {
while (!complete) {
.....//一些程序代码
try {
Thread.sleep(40);
} catch (InterruptedException e) {}
                }
}
C类中的run如下:
public void run() {
while (!complete) {
.....//一些程序代码
try {
Thread.sleep(200);
} catch (InterruptedException e) {}
                }
}理论上来说A线程在运行状态running的时候,其他的B和C要么处于sleep状态,要么处于可运行runnable状态;即使所以他们都处于runnable状态,那也是都在等待序列中,等待A的sleep的到来.
可是我的程序为什么是这种现象,我通过设几个打印点()假定threadA需要执行4步,发现结果是这样的,A线程在运行到1,2步骤后中途的时候被中断,B或C开始运行,B,C反复运行几次后,C接下去3,4步骤.
现象如下,
threadA 1 is running
threadA 2 is running
threadB is running
threadB is running
threadB is running
threadC is running
threadB is running
threadB is running
threadB is running
threadC is running
threadA 3 is running
threadA 4 is running
.......
如此反复.
高手能解释一下吗?
是不是sleep完成后,处于runnable状态也有个时间上限,如果超过,则强行运行呢?

解决方案 »

  1.   

    不是runnable有时间上限,而是正在运行的线程有一个上限,也就是时间片
    线程的时间片用完,就会被强行退出CPU资源的占用,让另一个处于"就绪"态的来运行...拿你到程序来说:A运行,虽然有SLEEP,可是A线程还没运行到SLEEP它到时间片到期,那他就被退出运行,让B线程运行...B线程或者时间片到,或者调用sleep...又让a运行,这时a才sleep...b来运行..这是操作系统的线程调用算法...<操作系统概论>一书有讲..
      

  2.   

    简单来说就是一个线程如果占用CPU太长时间,CPU会强行退出该线程转而执行另一个线程
      

  3.   

    只要把A线程的优先级设置为大于5就ok了