当前位置: 首页 > 面试题库 >

Java中的高分辨率计时器

爱繁
2023-03-14
问题内容

我想用Java模拟TCP。

为此,我有多个线程,例如每个TCP连接的发送者和接收者线程。

我的问题是,我想暂停(如Thread.sleep())线程数微秒的时间间隔。这样我就可以模拟流控制,发送者线程将在发送下一个数据包之前阻塞几微秒,同时接收和数据处理线程可以使用CPU。但是我找不到任何执行sleep()或wait()的方法来获得微秒或纳秒分辨率。如何以微秒或纳秒分辨率阻塞(暂停)Java中的线程?

我找到了System.nanoTime()方法,但是没有方法在指定的微秒或纳秒内阻塞线程。如果有任何此类方法,请告诉我。System.nanoTime()仅给出相对时间间隔(以纳秒为单位)。

我可以使用Busy循环使用System.nanoTime()在线程中执行纳秒级延迟,但这会浪费CPU,而CPU可能已用于接收数据线程或处理线程。

另一个令人困惑的问题:

通过上网,我发现Thread.sleep()或wait()方法在Windows
System中阻塞了至少指定的毫秒数或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);
    }
}

在具有2.53 GHz Intel Core
i5的系统中,多次运行时,我得到类似以下的输出。*此输出中未打印下面输出中的换行符,我已从控制台复制了输出,但是它在控制台中给了我换行符,这没问题。

螺纹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

请指导我。

很久很抱歉。感谢您阅读全文。


问题答案:

您受OS线程调度程序的支配,对此您无能为力。仅仅因为您睡眠时间很短并不意味着调度程序将在完成睡眠后立即唤醒您的线程。而且线程优先级只是一个提示,没有任何保证。



 类似资料:
  • 我想用Java模拟TCP。 我找到了System.nanotime()方法,但是没有方法可以在指定的微秒或纳秒内阻塞线程。如果有这样的方法,那么请让我知道。system.nanotime()只是给出了以纳秒为单位的相对时间间隔。 我可以使用System.nanotime()在使用busy-loop的线程中执行纳秒级延迟,但这将浪费CPU时间,而CPU本来可以用于接收数据线程或处理线程。 另一个令人

  • 问题内容: 在Windows下,有一些方便的功能,如from 可以创建高分辨率计时器。Linux有类似的东西吗? 问题答案: 在此之前ows-queryperformancecounter-on-osx)有人问过它-但是基本上,您可以使用boostptime函数,或者可以基本实现相同目的的POSIX clock_gettime()函数。

  • 好的,这里有一个奇怪的问题,我有问题(用gcc btw编译) 下面是用于命令提示的Mandelbrot分形生成器的源代码。我以前做过这项工作,我想加快自己的测试速度,看看我能以多快的速度生成命令提示符中实际生成Mandelbrot分形所需的代码。我经常这样做是为了给自己找点乐子 不管怎样,我遇到了一个新问题,我不太明白问题是什么。当分形呈现时,无论我设置了多少次迭代或什么转义值,它都将始终显示为椭

  • 我有一个java的列表。awt。图像,每个分辨率为300 DPI。我想打印它们,当我开始打印这些图像时(使用javax.PrintService API),只打印一些图像的一部分,因为Java的打印/3D类默认使用72DPI(相对于我的图像的300 DPI)。但是,当我使用72 DPI的图像(与Java默认值具有相同的分辨率)时,所有图像都可以很好地打印(打印整个图像时,而不仅仅是其中的一部分)。

  • 问题内容: 我需要使用Java程序减小图像的大小(而不是宽度和高度)。他们为此提供了任何好的API吗? 我需要将大小从1MB减少到大约50kb-100 kb。当然,分辨率会降低,但这并不重要。 问题答案: 这是工作代码 这段代码对我来说很棒。如果需要调整图像大小,则可以在此处更改x和y比例J;

  • 问题内容: 我很难获得较低的屏幕分辨率,因为我的屏幕分辨率为1920x1080。 有谁知道如何获得屏幕分辨率的高度和宽度? 我在1024x768分辨率上检查了我的作品,结果全部乱成一团。 问题答案: 无法从CSS获取屏幕高度。但是,从CSS3开始,您可以使用媒体查询来根据分辨率控制模板的显示。 如果要使用媒体查询基于高度进行编码,则可以定义样式表并像这样调用它。