我有一项任务,我希望以固定费率运行。但是,每次执行后我还需要任务的结果。这是我试过的:
任务
class ScheduledWork implements Callable<String>
{
public String call()
{
//do the task and return the result as a String
}
}
不,我尝试使用ScheduledExecutorService
来安排它。事实证明,您无法以固定费率安排Callable
,只能Runnable
这样做。
请告知。
答案 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);