Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保线程获胜';Java中的延迟?_Java_Multithreading_Performance_Time - Fatal编程技术网

如何确保线程获胜';Java中的延迟?

如何确保线程获胜';Java中的延迟?,java,multithreading,performance,time,Java,Multithreading,Performance,Time,我写了一个多线程程序,它同时有两到四个线程。 其中一个线程是时间关键型线程,每500毫秒调用一次,不允许延迟超过10毫秒。但当其他线程有更多的加载时,我发现会出现一些延迟,大约两毫秒。(打印时间戳以显示)因此,我担心在运行很长时间后,它会延迟超过10毫秒,除了检查时间戳,并调整循环间隔以确保时间延迟不超过10毫秒,是否有任何方法可以确保安全 谢谢。您可以设置线程优先级: myCriticalThread.setPriority(Thread.MAX_PRIORITY); otherThread.

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


谢谢。

您可以设置线程优先级:

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

不过,这并不能真正保证任何事情。

听起来你需要

不能保证你的线程不会延迟,因为操作系统可能会决定优先考虑其他进程(除非你努力建立一个完整的实时系统,包括一个修改过的操作系统)。也就是说,对于基本任务,您应该使用如下方法:

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();
  }
}

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

如果时间非常关键,我会在专用于该线程的核心上使用繁忙等待。这会使您在超时时向上爬:

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-10毫秒

我认为这对操作没有帮助。这是一些沉重的WebSphere积垢。我真的不认为有什么好的实时Java解决方案。我本可以给出这个链接:但我认为WebSphere站点很好地总结了这个概念(实际上它也是同一个JSR[JSR-1]的参考实现)。恐怕我在这方面没有太多的经验,RTSJ有什么不起作用的地方吗?据我所知,它仍处于规范级别和开放研究阶段。IBM的解决方案甚至可能值一点盐,但它很可能会将您束缚在IBM的束缚之中。