这里的函数强制返回是指在函数调用处结束阻塞,返回一个默认值, 同时调用执行函数线程的interrupt()方法,程序解除阻塞但不保证能能够结束函数的执行(参见API Thread的interrupt()方法)。为了更通用一点用了反射,如果对效率非常敏感,可自行修改去掉反射部分。
Worker.java:
/** */
/**
* 监控函数执行时间,若超时强制返回
* @author Liw
* @time 2007-6
*/
public class Worker
... {
/** *//**
* @param methodName 函数名
* @param defaultValue 默认值。若为基本类型则需转换为其包装类,如int类型的1需转换成new Integer(1)
* @param timeout 超时时间
* @param currentObj 要执行函数的对象
* @param paramValues 参数值
* @param primitiveTypeIndex 基本数据类型在参数列表中的索引,下表从0开始
* @return 函数返回值
*/
public Object work(String methodName, Object defaultValue, long timeout, Object currentObj, Object[] paramValues, int[] primitiveTypeIndex)
...{
if (paramValues == null) ...{
paramValues = new Object[]...{};
}
if (primitiveTypeIndex == null) ...{
primitiveTypeIndex = new int[]...{};
}
MonitorThread monitor = new MonitorThread(defaultValue, timeout);
WorkThread worker = new WorkThread(monitor, currentObj, methodName, paramValues, primitiveTypeIndex);
worker.start();
monitor.start();
monitor.waitFor();
if (worker.isAlive()) ...{
worker.interrupt();
}
if (monitor.isAlive()) ...{
monitor.interrupt();
}
return monitor.getResult();
}
}
* 监控函数执行时间,若超时强制返回
* @author Liw
* @time 2007-6
*/
public class Worker
... {
/** *//**
* @param methodName 函数名
* @param defaultValue 默认值。若为基本类型则需转换为其包装类,如int类型的1需转换成new Integer(1)
* @param timeout 超时时间
* @param currentObj 要执行函数的对象
* @param paramValues 参数值
* @param primitiveTypeIndex 基本数据类型在参数列表中的索引,下表从0开始
* @return 函数返回值
*/
public Object work(String methodName, Object defaultValue, long timeout, Object currentObj, Object[] paramValues, int[] primitiveTypeIndex)
...{
if (paramValues == null) ...{
paramValues = new Object[]...{};
}
if (primitiveTypeIndex == null) ...{
primitiveTypeIndex = new int[]...{};
}
MonitorThread monitor = new MonitorThread(defaultValue, timeout);
WorkThread worker = new WorkThread(monitor, currentObj, methodName, paramValues, primitiveTypeIndex);
worker.start();
monitor.start();
monitor.waitFor();
if (worker.isAlive()) ...{
worker.interrupt();
}
if (monitor.isAlive()) ...{
monitor.interrupt();
}
return monitor.getResult();
}
}
WorkThread.java: