我在java中有一个调用webservice的方法。现在,如果网络服务花费超过 1 秒。的时间。我应该能够终止该方法并继续程序流程。
5 回答
谷歌番石榴的SimpleTimeLimiter会做你需要的,特别是它的callWithTimeout()
方法。
我建议您使用 Executors 框架并调用Future.get(long, TimeUnit)
. 至于杀死那个电话,你可以打电话Future.cancel(true)
。当然,您必须submit
包含Callable
调用。
如果您不想添加新库,您可以通过将 Web 服务调用委托给另一个线程来轻松完成此操作,并使用 1 秒的超时时间加入它。下面是一个完成这些任务的完整程序。有2个关键点:
- 使用异步线程进行调用并使用 TimeOut 加入它。您还可以将其设置为守护程序。
- 当操作中的值不需要被消耗时,传递给异步线程,这样它就不会进行不必要的分配。
代码:
public class Main {
String returnVar;
private static final long TIME_OUT=1000;//in mills
private void makeCall() {
WebServiceStubDummy ws = new WebServiceStubDummy();
Boolean timeElapsed = false;
Thread t = new Thread(new AsyncWSCall(ws,timeElapsed));
t.start();
try {
t.join(TIME_OUT);
} catch (InterruptedException e) {}
synchronized (ws) {
timeElapsed=true;
}
System.out.println(returnVar);
}
private class AsyncWSCall implements Runnable{
WebServiceStubDummy ws;
Boolean timeElapsed;
public AsyncWSCall(WebServiceStubDummy ws, Boolean timeElapsed){
this.ws=ws;
this.timeElapsed=timeElapsed;
}
@Override
public void run() {
String myStr = ws.dummyMethod();
//synchronize for shared variable timeElapsed
synchronized (ws) {
if(!timeElapsed){
//if time elapsed don't assign
returnVar=myStr;
}
}
}
}
class WebServiceStubDummy{
public String dummyMethod(){
try {
//Dummy Call: if changed to 2000 value will not be consumed
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "From Dummy Metho";
}
}
/**
* @param args
*/
public static void main(String[] args) {
Main m=new Main();
m.makeCall();
}}
您还可以根据您希望如何传递 WebService 对象以及您希望如何分配 WS 操作的结果来微调您的代码
SO-thread“在java中的某个指定时间限制后杀死线程”可能会有所帮助。它利用ExecutorService
也可以使用Java 中方法执行的时间限制。请记住,虽然 Thread.stop 已被弃用:
为什么不推荐使用 Thread.stop?
因为它本质上是不安全的。停止线程会导致它解锁所有已锁定的监视器。(当 ThreadDeath 异常向上传播堆栈时,监视器被解锁。)如果以前受这些监视器保护的任何对象处于不一致状态,则其他线程现在可能会查看这些处于不一致状态的对象。据说这些物体已损坏。当线程对损坏的对象进行操作时,可能会导致任意行为。这种行为可能很微妙且难以检测,也可能很明显。与其他未经检查的异常不同,ThreadDeath 以静默方式杀死线程;因此,用户没有警告他的程序可能已损坏。损坏可以在实际损坏发生后的任何时间出现,甚至在未来几小时或几天内。
使用 1 秒的超时。根据您的网络服务请求。