我知道jvm timeslices線程,至少在windows上。 無論如何,我可以找出默認時間片是什麼,或更改時間片?無論如何要弄清楚windows上的java時間片嗎?
我想過的一種方法是編寫我自己的循環調度程序,並將其作爲高優先級的線程運行,並讓它控制所有其他線程。這會起作用嗎?
我知道jvm timeslices線程,至少在windows上。 無論如何,我可以找出默認時間片是什麼,或更改時間片?無論如何要弄清楚windows上的java時間片嗎?
我想過的一種方法是編寫我自己的循環調度程序,並將其作爲高優先級的線程運行,並讓它控制所有其他線程。這會起作用嗎?
回答你的問題的第一部分。
我想下面的測試可以估計時間片。總體思路:啓動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服務器上,我得到5-15毫秒。
事實上,除非您使用的是使用「綠色線程」的JVM,否則最終會執行線程時間片分割和線程調度的操作系統。如果您需要修改調度等行爲,請首先查看操作系統提供的工具。
我想過的一種方式是編寫自己的循環調度程序,並將其作爲高優先級的線程運行,並讓它控制所有其他線程。這會起作用嗎?
沒有保證。這取決於操作系統的線程調度器對線程優先級的改變的響應程度。
這種方法(調整線程的優先級),其他問題是:
爲什麼你認爲有必要這樣做?
你看過JDK5的併發api嗎?我同意Stephen C的觀點,你爲什麼覺得需要編寫自己的調度程序? – 2010-09-13 00:23:22