java 方法超过执行时间后抛出异常
2014-12-02 14:53
399 查看
在线程中执行某方法,如果超出执行时间后立即抛出异常。停止该方法继续执行。
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* 方法超过执行时间后抛出异常
* @author Gary Huang
* create Time;2014-12-2
* email: 834865081@qq.com
* Copyright:归个人所有,转载请表名 出处
* 个人博客地址:http://blog.csdn.net/hfmbook
* */
public class CallMethod {
/***
* 方法参数说明
* @param target 调用方法的当前对象
* @param methodName 方法名称
* @param parameterTypes 调用方法的参数类型
* @param params 参数 可以传递多个参数
*
* */
public static Object callMethod(final Object target , final String methodName ,final Class<?>[] parameterTypes,final Object[]params){
ExecutorService executorService = Executors.newSingleThreadExecutor();
FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
public String call() throws Exception {
String value = null ;
try {
Method method = null ;
method = target.getClass().getDeclaredMethod(methodName , parameterTypes ) ;
Object returnValue = method.invoke(target, params) ;
value = returnValue != null ? returnValue.toString() : null ;
} catch (Exception e) {
e.printStackTrace() ;
throw e ;
}
return value ;
}
});
executorService.execute(future);
String result = null;
try{
/**获取方法返回值 并设定方法执行的时间为10秒*/
result = future.get(10 , TimeUnit.SECONDS );
}catch (InterruptedException e) {
future.cancel(true);
System.out.println("方法执行中断");
}catch (ExecutionException e) {
future.cancel(true);
System.out.println("Excuti on异常");
}catch (TimeoutException e) {
future.cancel(true);
throw new RuntimeException("invoke timeout" , e );
}
executorService.shutdownNow();
return result ;
}
public Object call(Integer id){
try {
Thread.sleep( 11000 ) ;
} catch (Exception e) {
}
return id ;
}
public static void main(String[] args) {
System.out.println( callMethod(new CallMethod(), "call" , new Class<?>[]{Integer.class}, new Object[]{ 1523 } ) ) ;
}
}
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* 方法超过执行时间后抛出异常
* @author Gary Huang
* create Time;2014-12-2
* email: 834865081@qq.com
* Copyright:归个人所有,转载请表名 出处
* 个人博客地址:http://blog.csdn.net/hfmbook
* */
public class CallMethod {
/***
* 方法参数说明
* @param target 调用方法的当前对象
* @param methodName 方法名称
* @param parameterTypes 调用方法的参数类型
* @param params 参数 可以传递多个参数
*
* */
public static Object callMethod(final Object target , final String methodName ,final Class<?>[] parameterTypes,final Object[]params){
ExecutorService executorService = Executors.newSingleThreadExecutor();
FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
public String call() throws Exception {
String value = null ;
try {
Method method = null ;
method = target.getClass().getDeclaredMethod(methodName , parameterTypes ) ;
Object returnValue = method.invoke(target, params) ;
value = returnValue != null ? returnValue.toString() : null ;
} catch (Exception e) {
e.printStackTrace() ;
throw e ;
}
return value ;
}
});
executorService.execute(future);
String result = null;
try{
/**获取方法返回值 并设定方法执行的时间为10秒*/
result = future.get(10 , TimeUnit.SECONDS );
}catch (InterruptedException e) {
future.cancel(true);
System.out.println("方法执行中断");
}catch (ExecutionException e) {
future.cancel(true);
System.out.println("Excuti on异常");
}catch (TimeoutException e) {
future.cancel(true);
throw new RuntimeException("invoke timeout" , e );
}
executorService.shutdownNow();
return result ;
}
public Object call(Integer id){
try {
Thread.sleep( 11000 ) ;
} catch (Exception e) {
}
return id ;
}
public static void main(String[] args) {
System.out.println( callMethod(new CallMethod(), "call" , new Class<?>[]{Integer.class}, new Object[]{ 1523 } ) ) ;
}
}
相关文章推荐
- C与Java中计算程序执行时间的方法
- java继承并重写方法时抛出一样的异常或不抛异常,既不能多也不能少,范围既不能打也不能小
- 讨论:一个类的方法应该使用返回值来标识执行状态,还是抛出异常?
- 捕获Java线程池执行任务抛出的异常
- 【Java】ArrayList 的 toArray() 方法抛出 ClassCastException 异常
- Struts2 抛 java.lang.NoSuchMethodException:(无法找到某一特定方法时,抛出该异常)
- 捕获Java线程池执行任务抛出的异常
- Java打印抛出异常的方法名称
- JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?
- 【转】drupal7请求异常,执行时间过长的解决方法
- Java 中子类重写父类的方法时声明抛出异常不能比父类范围大
- 异常父类为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大
- java中重写方法必须抛出和原方法一样的异常或者不抛异常
- drupal7请求异常,执行时间过长的解决方法
- c与java中计算程序执行时间的方法
- java timer 实现在指定时间执行方法
- java异常抛出时间顺序
- 为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大
- Effective Java 学习笔记(第62条:每个方法抛出的异常都要有文档)
- JAVA:内层方法抛出异常 外层方法捕捉并处理异常