繁体   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