Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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_Optimization_Timeout_Timertask - Fatal编程技术网

如何在java中实现有效的超时

如何在java中实现有效的超时,java,optimization,timeout,timertask,Java,Optimization,Timeout,Timertask,有执行某些操作的n对象。执行操作后,将更新时间戳。现在我想实现一个超时线程,它验证时间戳是否早于例如60秒 我的第一个解决方案是使用一个线程(whileloop+sleep)来实现这一点,该线程包含一个包含所有对象(包括最后一个时间戳)的列表。现在我遇到的问题是,在最坏的情况下,线程需要59秒加上睡眠时间来决定超时 我正在寻找一个解决方案,比如一个计时器,它可以更新延迟时间 有什么想法吗?每次更新时间戳时都会中断线程。然后它将循环,找不到要做的事情,睡眠,如果时间戳没有发生其他事情,则使其过期。

有执行某些操作的
n
对象。执行操作后,将更新时间戳。现在我想实现一个超时线程,它验证时间戳是否早于例如60秒

我的第一个解决方案是使用一个线程(whileloop+sleep)来实现这一点,该线程包含一个包含所有对象(包括最后一个时间戳)的列表。现在我遇到的问题是,在最坏的情况下,线程需要59秒加上睡眠时间来决定超时

我正在寻找一个解决方案,比如一个计时器,它可以更新延迟时间


有什么想法吗?

每次更新时间戳时都会中断线程。然后它将循环,找不到要做的事情,睡眠,如果时间戳没有发生其他事情,则使其过期。如果第二次被打断,那就更好了。而且在任何时候,它的睡眠时间都不应该超过60减去(当前时间减去最早的时间戳)。

我认为使用带有wait/notify的监视器对象是合理的(如果使用JDK>=5,则可以使用带有wait/signal的Condition)

想法很简单:

工作线程:

doYourActualWork();
synchronized(jobFinishedMonitor) {
    updateTimestamp();

    jobFinishedMonitor.notify();
}
超时线程:

synchronized(jobFinishedMonitor) {
    while(within60Second(timestamp)) {
        jobFinishedMonitor.wait(60);
    }
    if (within60Second(timestamp)) {
        timeoutHappened=true;
    }
 }
 if (timeoutHappened) {
     // do timeout handling
 }

对于这个问题,不清楚你想对超时做什么。在这里,我向您展示了两个实现轻量级超时的选项:监视和控制

监控超时

对于全局计时器,您可以使用JDK中的
timer
功能:

public TimeoutTask implements TimerTask {
    List<MonitorableObject>  objects;
    public TimeoutTask(List<MonitorableObject> objects) {
        // make sure you can share this collection concurrently, 
        // e.g. copyonwritearraylist
        this.objects = objects;
    }
    public void run() {
       // objects -> filter(isTimeOut(currentTime)) -> do something
    }
}

Timer timer = new Timer();
timer.schedule(new TimeoutTask(myObjectList), 0,60*1000); // repeat each 60secs
我更喜欢
ScheduledExecutorService
高于
Timer
功能,因为
scheduledexecutor
可以容纳线程池。此外,底层线程池还可用于调用
scheduledExecutorService.execute(…)
以立即并发执行(未计划)的其他操作,使其成为通用的执行器功能,而不是专用的计时器功能

在这两种情况下,您都需要特别小心,以安全地从正在监视的对象中获取超时值。通常,您将在对象中使用同步方法来请求其超时状态

强制超时

ExecutorService为您提供了一个API,用于在给定的超时时间内执行一组任务。e、 g

List<Callable<?>> myTasks = ...;
// populate myTasks with Callable`s that wrap your intended execution

ExecutorService executorService = ... ;

List<Future<?>> results = executorService.invokeAll(myTasks, 60, TimeUnit.SECONDS);
List>results=executorService.invokeAll(myTasks,60,TimeUnit.SECONDS);

在这个方法返回后,您可以询问每个未来的人它是否在给定的时间内成功。

我发现很难理解您的逻辑。请给我一个示例代码,看看你想做什么?我觉得你想监视一些线程的“工作完成”事件。为此,您可以使用
CountDownLatch
。当一个对象及时完成时会发生什么?当他们不这样做时会发生什么?你允许他们继续吗?还是他们需要停止?有几种选择。你能把你的目标加到这个问题上吗?另一个澄清:当你说“有n个对象执行某些操作…”时,我猜你的意思是“n个线程…”应该等待(60_000)60秒
List<Callable<?>> myTasks = ...;
// populate myTasks with Callable`s that wrap your intended execution

ExecutorService executorService = ... ;

List<Future<?>> results = executorService.invokeAll(myTasks, 60, TimeUnit.SECONDS);