2011-09-07 34 views
8

Tôi có một nhiệm vụ mà tôi muốn chạy với tốc độ cố định. Tuy nhiên tôi cũng cần kết quả của nhiệm vụ sau mỗi lần thực hiện. Đây là những gì tôi đã cố gắng:Lập kế hoạch một cuộc gọi với mức cố định

Nhiệm vụ

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

Không, tôi cố gắng sử dụng ScheduledExecutorService để lên kế hoạch nó. Hóa ra bạn không thể lên lịch Callable ở mức cố định, chỉ có thể thực hiện một số Runnable.

Vui lòng thông báo.

+0

hoặc ... Thay vì chờ đợi cho giá trị trở lại của Callable, tại sao không xử lý trong nó? Vì vậy, bạn sẽ có một Runnable thay vì Callable của bạn và trong Runnable, một khi bạn có giá trị bạn muốn hành động trên, chỉ cần sử dụng nó và làm những gì bạn muốn. –

Trả lời

8

Sử dụng một số producer/consumer pattern: Có kết quả chạy được put trên số BlockingQueue. Có một chuỗi khác take() từ hàng đợi.

Thực hiện cuộc gọi chặn (nghĩa là chỉ trả lại khi có thứ gì đó nằm trong hàng đợi), vì vậy bạn sẽ nhận được kết quả ngay khi có sẵn.

Bạn có thể kết hợp điều này với số hollywood pattern để cung cấp chuỗi chờ đợi bằng gọi lại để mã của bạn được gọi khi có thứ gì đó sẵn có.

-1

Trừ khi nếu bạn không quan tâm đến giá trị trả lại của Callable, bạn có thể bọc nó trong một Runnable và sử dụng để chuyển đến ScheduledExecutorService.

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

Sau đó, khi bạn muốn gửi đến ScheduledExecutroService bạn có thể vượt qua bạn Callable:

ses.scheduleAtFixedRate(runnableOf(callabale), initialDelay, delay, unit); 
Các vấn đề liên quan