我在一个程序中自己主动设的有三个线程,每个类都用了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状态也有个时间上限,如果超过,则强行运行呢?
假定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状态也有个时间上限,如果超过,则强行运行呢?
解决方案 »
- 新人求救,困扰了多日的问题。JComboBox问题
- 如何控制内部窗体不重复弹出
- 简单 取消数组重复元素 的问题?急急急!!!
- 菜鸟问题,关于Map的
- 各位老师能不能写一个<html:errors>的带name和property的例子
- 请问一个JStatusBar问题
- ★★★ 难题求解!请帮忙! ★★★ (能写几个就写几个吧)
- 求救!!!初学者!!1
- 哪里出错了?
- 我已学了Delphi,现想学Web编程,学JBuilder,还是Java好???
- 在weblogic9里新建一个域后,没有application目录,访问http://localhost:7001出错
- [求助] 用sax解析xml文件时出错
线程的时间片用完,就会被强行退出CPU资源的占用,让另一个处于"就绪"态的来运行...拿你到程序来说:A运行,虽然有SLEEP,可是A线程还没运行到SLEEP它到时间片到期,那他就被退出运行,让B线程运行...B线程或者时间片到,或者调用sleep...又让a运行,这时a才sleep...b来运行..这是操作系统的线程调用算法...<操作系统概论>一书有讲..