【问题标题】:How to ensure a Thread won't delay in Java?如何确保线程不会在 Java 中延迟?
【发布时间】:2012-04-28 12:03:34
【问题描述】:

我写了一个多线程程序,它同时有两到四个线程。 其中一个线程是时间关键线程,每500毫秒调用一次,不允许延迟超过10毫秒。但是当其他线程有更多的负载时,我发现出现了一些延迟,大约是两毫秒。 (打印时间戳显示)所以,我担心运行很长时间后它会延迟超过10毫秒,除了检查时间戳,并调整循环间隔以确保时间不延迟超过10毫秒,有什么办法可以保证安全吗?

谢谢。

【问题讨论】:

    标签: java multithreading performance time


    【解决方案1】:

    继续超时:

    waitFor(int timeout)
    {
      dateTime wallTimeEnd;
      wallTimeEnd=now()+(msToDateTime(timeout));
      int interval=timeout/2;
      while(true){
        if(interval>10){
          sleep(interval);
          interval=dateTimeToMs(wallTimeEnd-now()) / 2;
        } 
          else
          {
            do{
              sleep(0);
              interval=dateTimeToMs(wallTimeEnd-now());
            }while(interval>0);
      }
    }
    

    这只会浪费一个内核 5-10ms

    【讨论】:

      【解决方案2】:

      您可以设置线程优先级:

      myCriticalThread.setPriority(Thread.MAX_PRIORITY);
      otherThread.setPriority(Thread.NORM_PRIORITY); // the default
      yetAnotherThread.setPriority(Thread.MIN_PRIORITY);
      

      但它并不能真正保证任何事情。

      【讨论】:

        【解决方案3】:

        无法保证您的线程不会延迟,因为操作系统可能会决定给予其他进程优先权(除非您努力建立一个完整的实时系统,包括经过修改的操作系统)。话虽如此,对于基本任务,您应该像这样使用ScheduledExecutorService

        class A {
          private final ScheduledExecutorService exe = Executors.newScheduledThreadPool(1);
        
          public void startCriticalAction(Runnable command) {
            this.exe.scheduleAtFixedRate(command, 100, 100, TimeUnit.MILLISECONDS);
          }
        
          public void shutdown() {
            this.exe.shutdown();
          }
        }
        

        执行器服务将尽最大努力每 100 毫秒执行一次任务。您不应该自己开发此功能,因为很多事情都可能出错。

        【讨论】:

          【解决方案4】:

          如果时间很关键,我会在专用于该线程的核心上使用忙等待。大多数情况下,这会给您

          这是我使用的库。您可以使用它来保留逻辑线程或整个内核。 https://github.com/peter-lawrey/Java-Thread-Affinity

          通过在 Linux 上的 grub.conf 中使用 isolcpus=,您可以确保逻辑线程或内核不用于任何其他操作(除了 100 Hz 定时器和电源管理,它们相对较小且延迟

          【讨论】:

            【解决方案5】:

            听起来你需要Real-Time Java

            【讨论】:

            • 我认为这对 OP 没有帮助。这是一些沉重的 WebSphere crud。我认为没有任何好的实时 Java 解决方案,真的。
            • 好吧,我本可以给出这个链接:rtsj.org,但我认为 WebSphere 站点在总结这个概念方面做得很好(它也是同一个 JSR [实际上是 JSR-1] 的参考实现)。恐怕我没有太多使用它的经验,RTSJ 有什么不工作的地方吗?
            • 据我所知,它仍处于规范级别和开放研究阶段。 IBM 的解决方案甚至可能物有所值,但它很可能会将您束缚在 IBM 的束缚中。
            猜你喜欢
            • 1970-01-01
            • 2017-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多