2011-09-07 41 views
8

我有一个任务,我想以固定费率运行。不过,每次执行后我都需要任务的结果。这里是我的尝试:安排一个固定费率的Callable

任务

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

不,我试图用ScheduledExecutorService来安排吧。事实证明,你不能以固定的速度安排Callable,只有Runnable可以这样做。

请指教。

+0

或...而不是等待可调用的返回值,为什么不能在它处理?所以你将拥有一个Runnable而不是你的Callable,并且在Runnable中,一旦你有了你想要的行为的价值,就用它来做你想做的事。 –

回答

8

使用producer/consumer pattern:在BlockingQueue上运行运行结果put。队列中有另一个线程take()

Take是一个阻塞呼叫(即只有当队列中有东西时才会返回),所以一旦它们可用就会得到结果。

您可以将它与hollywood pattern结合使用,为等待线程提供回调,以便在出现可用的情况时调用代码。

-1

除非您不在意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);