写一个java方法,包装调用另外一个方法,提供超时设置
时间: 2024-01-20 14:02:32 浏览: 78
好的,这是一个例子,它演示了如何使用Java编写一个包装方法来调用另一个方法,并提供超时设置:
```java
import java.util.concurrent.*;
public class TimeoutWrapper {
public static <T> T callWithTimeout(Callable<T> callable, int timeout, TimeUnit timeUnit) throws Exception {
// 创建一个 ExecutorService 来执行 callable
ExecutorService executor = Executors.newSingleThreadExecutor();
// 使用 submit 方法提交 callable
Future<T> future = executor.submit(callable);
try {
// 等待指定的时间,以获取结果
return future.get(timeout, timeUnit);
} catch (TimeoutException e) {
// 如果超时,则取消任务并抛出异常
future.cancel(true);
throw e;
} finally {
// 关闭 ExecutorService 来释放资源
executor.shutdown();
}
}
}
```
在这个例子中,我们定义了一个名为`callWithTimeout`的静态方法,它接受一个`Callable`对象(即另一个方法)和一个超时时间。该方法将创建一个`ExecutorService`来执行`Callable`对象,并使用`Future`对象获取结果。如果调用超时,我们将取消任务并抛出`TimeoutException`异常。最后,我们将关闭`ExecutorService`来释放资源。
下面是一个例子,演示了如何使用`callWithTimeout`方法来调用另一个方法,并设置超时时间为5秒:
```java
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
Callable<String> callable = new Callable<String>() {
public String call() throws Exception {
// 在这里调用另一个方法
return longRunningMethod();
}
};
try {
// 调用 callWithTimeout 方法,设置超时时间为5秒
String result = TimeoutWrapper.callWithTimeout(callable, 5, TimeUnit.SECONDS);
System.out.println(result);
} catch (TimeoutException e) {
System.err.println("调用超时!");
} catch (Exception e) {
System.err.println("调用出错:" + e.getMessage());
}
}
public static String longRunningMethod() throws InterruptedException {
// 模拟一个长时间运行的方法
Thread.sleep(10000);
return "调用成功!";
}
}
```
在这个例子中,我们定义了一个`Callable`对象`callable`,它将调用另一个方法`longRunningMethod`。我们使用`TimeoutWrapper`类的`callWithTimeout`方法来调用`callable`,并设置超时时间为5秒。如果调用超时,我们将捕获`TimeoutException`异常并输出错误消息。如果调用成功,我们将输出结果`"调用成功!"`。
阅读全文