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