10

我有一个要以固定速率运行的任务。但是,我还需要每次执行后的任务结果。这是我尝试过的:

任务

class ScheduledWork implements Callable<String>
{
    public String call()
    {
        //do the task and return the result as a String
    }
}

不,我尝试使用ScheduledExecutorService来安排它。事实证明,您不能Callable以固定的速率安排 a,只能Runnable这样做。

请指教。

4

2 回答 2

10

使用生产者/消费者模式:让 Runnable其结果放在BlockingQueue上。从队列中获取另一个线程take() 。

Take 是一个阻塞调用(即仅在队列中有内容时返回),因此您将在结果可用时立即获得结果。

您可以将此与好莱坞模式结合起来,为等待线程提供回调,以便在有可用内容时调用您的代码。

于 2011-09-07T09:45:12.713 回答
-1

除非您不关心您的返回值,否则Callable您可以将它包装在 a 中Runnable并使用它传递给ScheduledExecutorService.

public static Runnable runnableOf(final Callable<?> callable)
{
    return new Runnable()
    {
        public void run()
        {
            try
            {
                callable.call();
            }
            catch (Exception e)
            {
            }
        }
    };
}

然后当你想提交给你时,ScheduledExecutroService你可以通过你的Callable

ses.scheduleAtFixedRate(runnableOf(callabale), initialDelay, delay, unit);
于 2011-09-10T19:05:59.977 回答