2010-09-12 38 views
2

我知道jvm timeslices線程,至少在windows上。 無論如何,我可以找出默認時間片是什麼,或更改時間片?無論如何要弄清楚windows上的java時間片嗎?

我想過的一種方法是編寫我自己的循環調度程序,並將其作爲高優先級的線程運行,並讓它控制所有其他線程。這會起作用嗎?

+0

你看過JDK5的併發api嗎?我同意Stephen C的觀點,你爲什麼覺得需要編寫自己的調度程序? – 2010-09-13 00:23:22

回答

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服務器上,我得到5-15毫秒。

"The term "quantum" is a unitless measure of time for each time slice that a thread will run until a "context switch" occurs and another thread (either within the same program or from within another program) is selected to run. This prevents a CPU-bound process from monopolizing the processor. Currently in Windows, 3 quantums are equal to either 10 milliseconds (single processor) or 15 milliseconds (multiple-processor Pentium). This depends on the hardware abstraction layer (HAL) selected for your computer. Original Equipment Manufacturer (OEM) HALs may have a different value. Time slices that are fixed at 36 quantums are currently used when background services are selected (as you might choose in a typical server installation)."

4

事實上,除非您使用的是使用「綠色線程」的JVM,否則最終會執行線程時間片分割和線程調度的操作系統。如果您需要修改調度等行爲,請首先查看操作系統提供的工具。

我想過的一種方式是編寫自己的循環調度程序,並將其作爲高優先級的線程運行,並讓它控制所有其他線程。這會起作用嗎?

沒有保證。這取決於操作系統的線程調度器對線程優先級的改變的響應程度。

這種方法(調整線程的優先級),其他問題是:

  • 這將不可避免地使你的應用更加特定平臺相對於您的調度和真實(黑盒)線程調度,
  • 之間的相互作用
  • 這將很難知道您的調度程序是否有效,並且
  • 它會在應用程序中更難追蹤「heisenbugs」。

爲什麼你認爲有必要這樣做?