以固定速率调度可调用对象

时间:2011-09-07 09:42:47

标签: java java.util.concurrent

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

任务

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

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

请告知。

2 个答案:

答案 0 :(得分:9)

使用producer/consumer pattern:将{Runerable put的结果放在BlockingQueue上。从队列中获得另一个线程take()

Take是一个阻止调用(即只有在队列中有某些内容时才会返回),因此您可以在结果可用时立即获得结果。

您可以将其与hollywood pattern结合使用,为等待线程提供回调功能,以便在某些内容可用时调用您的代码。

答案 1 :(得分:-2)

除非您不关心Callable的返回值,否则可以将其包裹在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);