【发布时间】:2013-12-06 14:52:06
【问题描述】:
在java中大家都知道,Thread.join(long millis)的意思是“最多等待毫秒毫秒让这个线程死掉”,但是我发现毫秒不是很准确,请看下面的代码:
public class MyThreadTest {
public void invokeTest() {
long executionTimeLimit = 10;
Runner rn = new Runner();
rn.start();
try {
long time = System.currentTimeMillis();
rn.join(executionTimeLimit);
long l1 = (System.currentTimeMillis() - time);
System.out.println("execution_time_limit="+executionTimeLimit+" the invoke method time is "+l1+" millisecond");
} catch (Exception e) {
//e.printStackTrace();
}
}
public static void main(String args[]) {
MyThreadTest mtt = new MyThreadTest();
mtt.invokeTest();
}
private final class Runner extends Thread {
public void run()
{
//to make the program a bit longer
int size = 3000;
String[][] bb = new String[size][size];
for(int i=0;i<size;i++)
for(int j=0;j<size;j++) {
bb[i][j] = "bbbbbbbbbbb";
}
}
}
}
运行多次后输出的日志不一样:
"execution_time_limit=10 调用方法时间为11毫秒" "execution_time_limit=10 调用方法时间为 32 毫秒" "execution_time_limit=10 调用方法时间为34毫秒"
为什么会这样?
【问题讨论】:
-
在测量持续时间时,定时器/时钟精度存在一般问题。看看这里:stackoverflow.com/questions/351565/…
-
这甚至不是 Java 问题。如果您想要高精度的线程调度,您很可能最终会使用自旋锁定。
标签: java multithreading