有一种方法我需要经常更新每一个特定的时间,所以我测试java ExecutorService,但我的方法没有经常更新,你能告诉我为什么?
这些是我的课程
FutureTask.java
package com;
import java.lang.reflect.Method;
import java.util.concurrent.*;
public class FutureTask {
private static ExecutorService executor = Executors.newCachedThreadPool();
private static FutureTask _instance = new FutureTask();
public static FutureTask getInstance() {
return _instance;
}
private static int timoutsec = 15;
public Object submiteTask(final Object obj, final Method method,
final Object[] params) throws Exception {
return submiteTask(obj, method, params, -1);
}
public Object submiteTask(final Object obj, final Method method,
final Object[] params, int timeoutSeconds) throws Exception {
if (null != obj && method != null) {
Callable<Object> task = new Callable<Object>() {
public Object call() {
try {
method.setAccessible(true);
Object resultObj = method.invoke(obj, params);
return resultObj;
} catch (Exception e) {
}
return null;
}
};
Future<Object> future = executor.submit(task);
try {
Object result = null;
if (timeoutSeconds < 0) {
result = future.get(timoutsec, TimeUnit.SECONDS);
} else {
result = future.get(timeoutSeconds, TimeUnit.SECONDS);
}
return result;
} catch (TimeoutException e) {
} catch (Exception e) {
} finally {
future.cancel(true);
}
}
return null;
}
public static void main(String args[]) {
try {
FutureTask.getInstance().submiteTask(
new TestingFutureTaskUtil(),
TestingFutureTaskUtil.class.getDeclaredMethod(
"updateMethodCalled",
new Class<?>[] { String.class }),
new Object[] { "UBSC!OC1010" }, 1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
TestingFutureTaskUtil.java
package com;
public class TestingFutureTaskUtil {
public void updateMethodCalled(String symbol) {
System.out.println("updateMethodCalled" + symbol);
}
}
提前致谢。
答案 0 :(得分:1)
您只提交一份作业,因此只调用一次updateMethodCalled。
答案 1 :(得分:1)
您正在使用普通的ExecutorService。它不允许安排任务。您需要使用ScheduledExecutorService。
您需要更改以下内容:
private static ScheduledExecutorService executor = Executors.newScheduledThreadPool(poolSize);
和
Future<Object> future = executor.scheduleAtFixedRate(task, timeoutSeconds, timeoutSeconds, TimeUnit.SECONDS);
现在每隔“timeoutSeconds”秒执行一次任务。之后,您可以返回ScheduledFuture,并可以从中获取更新的值。
也许只是因为这个例子,但我会创建一个可调用的外部并将其交给FutureTask。比你不需要反思。你进行异步调用的方式也是错误的,因为调用线程总是等待计算完成。因此,您无法从其他线程中运行该方法中获得任何好处。也许你需要重新思考你正在做的事情的整个设计。