0

有一种方法我需要每隔特定时间频繁更新,所以我正在测试 java ExecutorService,但我的方法没有经常更新,请告诉我为什么?

这些是我的课

未来任务.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);

    }

}

提前致谢 。

4

2 回答 2

1

您只提交一份作业,因此 updateMethodCalled 只被调用一次。

于 2013-07-11T12:45:27.597 回答
0

您正在使用普通的 ExecutorService。它不允许安排任务。您需要使用 ScheduledExecutorService。

您需要更改以下内容:

private static ScheduledExecutorService executor = Executors.newScheduledThreadPool(poolSize);

和:

Future<Object> future = executor.scheduleAtFixedRate(task, timeoutSeconds, timeoutSeconds, TimeUnit.SECONDS);

现在任务将每“timeoutSeconds”秒执行一次。之后,您可以返回 ScheduledFuture 并从中获取更新的值。

也许只是因为这个例子,但我会在外面创建一个可调用的并将它交给 FutureTask。比你不需要反射。此外,您进行异步调用的方式也是错误的,因为调用线程总是等待计算完成。因此,您不会从在其他线程中运行该方法获得任何好处。也许您需要重新考虑您正在做的事情的整个设计。

于 2013-07-11T12:56:49.520 回答