为什么ExecutorService不会频繁执行

时间:2013-07-11 12:38:40

标签: java multithreading

有一种方法我需要经常更新每一个特定的时间,所以我测试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);

    }

}

提前致谢。

2 个答案:

答案 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。比你不需要反思。你进行异步调用的方式也是错误的,因为调用线程总是等待计算完成。因此,您无法从其他线程中运行该方法中获得任何好处。也许你需要重新思考你正在做的事情的整个设计。