簡體   English   中英

java中的高分辨率計時器

[英]high resolution timer in java

我想在Java中模擬TCP。

為此,我有多個線程,如每個TCP連接的發送方和接收方線程。

我的問題是,我想暫停(如Thread.sleep())線程微秒的時間間隔。 這樣我就可以模擬流控制,其中發送方線程在發送下一個數據包之前會阻塞微秒,同時CPU可以被接收和數據處理線程使用。 但我找不到任何執行sleep()或wait()微秒或納秒分辨率的方法。 如何以微秒或納秒的分辨率阻止(暫停)Java中的線程?

我找到了System.nanoTime()方法,但是沒有方法可以阻止指定微秒或納秒的線程。 如果有任何此類方法,請告訴我。 System.nanoTime()只給出以納秒為單位的相對時間間隔。

我可以使用System.nanoTime()在線程中使用busy-loop執行納秒延遲,但這會浪費CPU,這可能已用於接收數據線程或處理線程。

另一個混亂的問題:

通過瀏覽互聯網,我在Windows系統中找到了Thread.sleep()或wait()方法塊至少指定的毫秒或10ms的倍數,以較小者為准,沒有線程中斷。 但是當我運行示例示例時,我發現了非常不同的結果。 就像線程睡眠時間少於指定的毫秒數。 有些線程給我100微秒的睡眠時間。 是否測量時間錯誤? 是不是System.nanoTime()那么准確? 請參閱下面的示例,我得到的結果非常不同。 線程優先級也沒有給出預測結果。

public class MyClass {
    public static void main(String args []){
        Runnable r = new Runnable() {
            public void run() {
                long s = System.nanoTime();
                //Thread.yield();  // Try for yield, need to check - in how much time high priority thread will be scheduled back after yielding
                try{
                    Thread.sleep(1);
                }catch(Exception e){

                }
                long e = System.nanoTime() - s;
                System.out.println(Thread.currentThread().getName()+e);
            }
        };

        Thread t1 = new Thread(r, "Thread T1: ");
        t1.setPriority(Thread.MAX_PRIORITY);
        t1.start();

        Thread t2 = new Thread(r, "Thread T2: ");
        t2.setPriority(Thread.MIN_PRIORITY);
        t2.start();

        Thread t3 = new Thread(r, "Thread T3: ");
        t3.setPriority(Thread.NORM_PRIORITY);
        t3.start();

        Thread t4 = new Thread(r, "Thread T4: ");
        t4.setPriority(Thread.MAX_PRIORITY);
        t4.start();

        long s = System.nanoTime();
        try{
            Thread.sleep(1);
        }catch(Exception e){

        }
        long e = System.nanoTime() - s;
        System.out.println("Main: "+e);
    }
}

在我的Intel Core i5,2.53 GHz系統中,我在多次運行中獲得類似下面的輸出。 *在這篇文章中沒有打印下面輸出的新行,我已經從控制台復制了輸出,但它在我的控制台中給了我新行,這不是問題。

線程T1:736682線程T3:700212線程T2:478559主要:548257線程T4:458299

第二次運行 -

線程T3:27555線程T2:139799線程T1:152361主要:93199線程T4:29986

第三次運行 -

線程T4:724525線程T2:1050319主要:752486線程T1:941316線程T3:1000883

第四次運行 -

線程T1:174243線程T2:166543線程T3:1005745主要:1023170線程T4:915787

在上面的運行中,我得到微秒阻塞。 :o

請指導我這個。

為長篇帖子道歉。 感謝您閱讀全文。

請注意, Thread.sleep(timeout)保證Thread至少休眠超時ms(受底層系統的精度限制),但它可能會睡得更久。

有一個Thread.sleep(millis, nanos) ,但精度也不是很好。 正如@TimBender在下面指出的那樣,在OpenJDK 6-b14中,它甚至通過舍入並調用Thread.sleep(millis)實現這一點。 因此,可以相當安全地說,在任何Java實現中,您都不能依賴它在一個確切的時間間隔內休眠。

你受操作系統線程調度程序的支配,你不能做太多。 僅僅因為你睡了很短的時間並不意味着調度程序一旦完成睡眠就會喚醒你的線程。 線程優先級只是一個提示,沒有任何保證。

試試這個:

Thread.sleep(0, 250); // sleep 250 nanoseconds

我相信你想要使用的是Condition.awaitNanos ,但我找不到任何確鑿的證據證明這將在接近所要求的時間內以高精度返回。

或者,您可以傳遞一個“awaitNanos”時間,該時間略小於所需的總時間,然后循環“直播等待”,直到總時間過去。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM