`
kanpiaoxue
  • 浏览: 1781899 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

如何计算一个方法调用超时?

 
阅读更多

在日常的编程中我们经常会为一些特别消耗资源的动作添加一些限制,比如:timeout,超时。当超过这个时间的时候,我们应该采取某些措施。

该如何验证这个方法已经超时了呢?我们可以参考一下apache的做法。

代码如下:

/*
 * ====================================================================
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 */
package org.apache.http.concurrent;

import org.apache.http.util.Args;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * Basic implementation of the {@link Future} interface. <tt>BasicFuture<tt>
 * can be put into a completed state by invoking any of the following methods:
 * {@link #cancel()}, {@link #failed(Exception)}, or {@link #completed(Object)}.
 *
 * @param <T> the future result type of an asynchronous operation.
 * @since 4.2
 */
public class BasicFuture<T> implements Future<T>, Cancellable {

    private final FutureCallback<T> callback;

    private volatile boolean completed;
    private volatile boolean cancelled;
    private volatile T result;
    private volatile Exception ex;

    public BasicFuture(final FutureCallback<T> callback) {
        super();
        this.callback = callback;
    }

    public boolean isCancelled() {
        return this.cancelled;
    }

    public boolean isDone() {
        return this.completed;
    }

    private T getResult() throws ExecutionException {
        if (this.ex != null) {
            throw new ExecutionException(this.ex);
        }
        return this.result;
    }

    public synchronized T get() throws InterruptedException, ExecutionException {
        while (!this.completed) {
            wait();
        }
        return getResult();
    }

    public synchronized T get(final long timeout, final TimeUnit unit)
            throws InterruptedException, ExecutionException, TimeoutException {
        Args.notNull(unit, "Time unit");
        final long msecs = unit.toMillis(timeout);
        final long startTime = (msecs <= 0) ? 0 : System.currentTimeMillis();
        long waitTime = msecs;
        if (this.completed) {
            return getResult();
        } else if (waitTime <= 0) {
            throw new TimeoutException();
        } else {
            for (;;) {
                wait(waitTime);
                if (this.completed) {
                    return getResult();
                } else {
                    waitTime = msecs - (System.currentTimeMillis() - startTime);
                    if (waitTime <= 0) {
                        throw new TimeoutException();
                    }
                }
            }
        }
    }

    public boolean completed(final T result) {
        synchronized(this) {
            if (this.completed) {
                return false;
            }
            this.completed = true;
            this.result = result;
            notifyAll();
        }
        if (this.callback != null) {
            this.callback.completed(result);
        }
        return true;
    }

    public boolean failed(final Exception exception) {
        synchronized(this) {
            if (this.completed) {
                return false;
            }
            this.completed = true;
            this.ex = exception;
            notifyAll();
        }
        if (this.callback != null) {
            this.callback.failed(exception);
        }
        return true;
    }

    public boolean cancel(final boolean mayInterruptIfRunning) {
        synchronized(this) {
            if (this.completed) {
                return false;
            }
            this.completed = true;
            this.cancelled = true;
            notifyAll();
        }
        if (this.callback != null) {
            this.callback.cancelled();
        }
        return true;
    }

    public boolean cancel() {
        return cancel(true);
    }

}

 

 我们要关注的是这个类的接口 java.util.concurrent.Future的方法:

    /**
     * Waits if necessary for at most the given time for the computation
     * to complete, and then retrieves its result, if available.
     *
     * @param timeout the maximum time to wait
     * @param unit the time unit of the timeout argument
     * @return the computed result
     * @throws CancellationException if the computation was cancelled
     * @throws ExecutionException if the computation threw an
     * exception
     * @throws InterruptedException if the current thread was interrupted
     * while waiting
     * @throws TimeoutException if the wait timed out
     */
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;

 这个get就有一个timeout的参数。

 

分享到:
评论

相关推荐

    PB6,PB7,PB8,PB9,PB10,PB11调用WEBSERVICE,并解决超时问题

    描述中提到的“AXIS2”是Apache软件基金会的一个开源Web服务框架,它用于部署和实现Web服务。AXIS2提供了高效的执行模型,支持多种协议(如SOAP、REST)和数据绑定技术。 “VB”可能是指Visual Basic,这是...

    EJB超时调用

    3. **接口调用机制**:从文件名"CallEJBInterfaceInvocationHandler.java"来看,这可能是一个实现了Java动态代理的类,用于在调用EJB接口时包装超时逻辑。动态代理允许在调用实际接口方法前和后添加额外的行为,比如...

    android串口调用,使用c开发的,可以设置串口超时

    首先,你需要在Android项目中集成NDK,创建一个jni目录存放C/C++源码,并在Java代码中定义JNI接口。 2. **打开串口**: - 在C代码中,你需要使用`open()`函数打开串口,例如`/dev/ttyS0`。确保在AndroidManifest....

    解决Python设置函数调用超时,进程卡住的问题

    最近写的Python代码不知为何,总是执行到一半卡住不动,为了使程序能够继续运行,设置了函数调用超时机制。 代码: import time import signal def test(i): time.sleep(i % 4) print %d within time % (i) ...

    C#函数超时执行事例

    在这个示例中,`ExecuteWithTimeout`方法接受一个无参数的返回整数的委托(`Func&lt;int&gt;`),以及一个超时毫秒数。它创建了一个`CancellationTokenSource`用于取消超时的任务,并启动两个异步任务:一个是执行函数,另...

    05丨HTTP调用:你考虑到超时、重试、并发了吗?

    其次,考虑到网络的不稳定,超时后的请求重试是一个不错的选择,但需要考虑服务端接口的幂等性设计是否允许我们重试;最后,需要考虑框架是否会像浏览器那样限制并发连接数,以免在服务并发很大的情况下,HTTP 调用...

    Java线程超时监控

    `ExecutorService`是一个接口,它提供了管理和控制线程池的能力,而`Future`则表示异步计算的结果。当我们提交一个任务到`ExecutorService`时,它会返回一个`Future`对象,我们可以利用这个对象来检查任务是否完成...

    Java调用WebService接口的方法

    在上述代码中,我们创建了一个`Service`对象,并通过`createCall()`方法创建了一个`Call`对象,这个`Call`对象用于实际的调用操作。 2. **设置WebService URL**:`service_url`变量包含了WebService的地址,它是...

    一个消息总线模块:当收到等待的消息时,调用回调函数;当在规定时间内没收到时,调用超时响应函数

    在这个特定的模块中,它包含两个关键功能:一个是当接收到预期消息时调用回调函数,另一个是如果在预设的时间内未接收到消息,则触发超时响应函数。 回调函数是程序设计中的一个重要概念,它允许我们提供一个函数给...

    一个轻量级的springboot项目性能分析工具源码+数据库,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈,可视化展示

    一个轻量级的springboot项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈,并进行可视化展示,还支持代码热更新与邮件预警 实时监听方法,统计运行时长 web展示方法调用链路,瓶颈可视化...

    C#异步调用的好处和方法

    - 通过定义一个`delegate`类型,并结合`BeginInvoke`和`EndInvoke`方法,可以轻松地实现异步调用。示例代码中展示了这一过程: ```csharp private delegate void delegateMeth(string bigPicUrl, string ...

    Zabbix调用脚本超时解决方案.docx

    在 Zabbix 中,调用脚本超时是一个常见的问题。当脚本执行时间超过 30 秒时,Zabbix 将获取该脚本执行的结果。这是由于 Zabbix 的内部源码限制了脚本执行的时间最多不超过 30秒。因此,需要找到一种方法来解决这个...

    Sql Server 数据库超时问题的解决方法

    query wait 选项可以设定一个查询在超时前等待所需资源的时间(以秒为单位,范围从 0 到 2147483647)。如果使用默认值 –1 或指定 –1,则超时时间通过计算得到,是预计查询成本的 25 倍。 在 Sql Server 2000 中...

    Android-一个让http接口调用跟调用本地方法一样自然优雅的项目

    首先,开发者定义一个接口,这个接口的每个方法对应一个HTTP API。方法的参数和返回类型分别代表了请求的参数和期望的响应数据。例如,我们可以定义一个获取用户信息的接口: ```java public interface UserService...

    rmi 远程方法调用

    RMI(Remote Method Invocation,远程方法调用)是Java中的一种技术,允许一个Java对象调用另一个在不同JVM(Java虚拟机)上的对象的方法。RMI是Java分布式计算的基础,它使得Java程序可以在网络环境中进行通信和...

    koTime是一个轻量级的springboot项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈

    koTime是一个轻量级的springboot项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈,并进行可视化展示,还支持代码热更新与邮件预警; 实时监听方法,统计运行时长; web展示方法调用链路,...

    小程序server请求微信服务器超时的解决方法

    今天有同学在测试小程序的过程中,发现一个问题,调用 微信官方的服务端接口超时 ,比如这个接口,https://api.weixin.qq.com/sns/jscode2session ,因为我们小程序登录的时候,会在自己server端调用微信的API,这个...

    nodejs使用原生的dubbo协议打通了dubbo的rpc方法调用.

    Dubbo是阿里巴巴开源的一个高性能、轻量级的Java RPC框架,它提供了丰富的服务治理功能。而在Node.js环境下,由于语言不同,实现这样的跨平台通信需要深入理解和应用Dubbo的协议规范。 描述进一步提到,“nodejs ...

    .net c#线程超时解决方案

    .net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的...

    webservice 客户端调用公共方法

    它是Java标准库中的一个类,用于打开和处理与URL关联的连接。通过这个类,我们可以发送HTTP请求并接收响应。在调用Web服务时,通常会使用GET或POST方法,这可以通过`URLConnection`来实现。 `JAXB (Java ...

Global site tag (gtag.js) - Google Analytics