2011-09-07 38 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);