我知道jvm timeslices线程,至少在windows上。 无论如何我可以找出默认的时间片是什么,或者改变时间片吗?
我想到的一种方法是编写自己的循环调度程序并将其作为高优先级的线程运行,并让它控制所有其他线程。那会有用吗?
答案 0 :(得分:4)
实际上,除非您使用的是使用“绿色线程”的JVM,否则最终会进行线程时间切片和线程调度的操作系统。如果您需要修改计划等行为,请首先查看操作系统提供的设施。
我想到的一种方法是编写自己的循环调度程序并将其作为高优先级的线程运行,并让它控制所有其他线程。那会有用吗?
没有保证。这取决于OS'线程调度程序对线程优先级的变化的响应程度。
这种方法的其他问题(调整线程优先级)是:
为什么你认为有必要这样做?
答案 1 :(得分:1)
回答问题的第一部分。
我认为以下测试可以估算时间片。一般想法:在以下循环中运行N个线程(N> Runtime.getRuntime()。availableProcessors()):
public void run() {
long warmUp = 20000;
long milli0 = System.currentTimeMillis();
long nano0 = System.nanoTime();
while (true) {
long milli1 = System.currentTimeMillis();
long nano1 = System.nanoTime();
if (warmUp > 0) {
warmUp--;
} else {
if (nano1 < nano0) {
log("WARNING: Nanotime goes back by " + (nano1 - nano0) + " ns");
warmUp = 20000;
} else
if (nano1 - nano0 > SPIKE) {
log("WARNING: Nanotime gap: " + (nano1 - nano0)/MILLIS_PER_NANO + " ms. System time delta: " + (milli1 - milli0) + " ms.");
warmUp = 20000;
}
}
nano0 = nano1;
milli0 = milli1;
}
}
结果将在很大程度上取决于平台。在我的Windows 2008 Server上,我得到5-15毫秒。