2011-09-07 18 views
8

पर एक कॉल करने योग्य शेड्यूल करना मेरे पास एक कार्य है जिसे मैं निश्चित दर पर चलाना चाहता हूं। हालांकि मुझे प्रत्येक निष्पादन के बाद कार्य के परिणाम की भी आवश्यकता है। यहाँ मैं क्या करने की कोशिश की है:एक निश्चित दर

कार्य

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

नहीं, मैं यह अनुसूचित करने ScheduledExecutorService का उपयोग करने की कोशिश की। बाहर निकलता है आप एक निश्चित दर पर Callable शेड्यूल नहीं कर सकते हैं, केवल Runnable ऐसा किया जा सकता है।

कृपया सलाह दें।

+0

या ... के बजाय प्रतिदेय की वापसी मान के लिए इंतज़ार कर, यह क्यों में संभाल नहीं? तो आपके कॉल करने योग्य और रननेबल के बजाए आपके पास एक रननेबल होगा, एक बार आपके पास उस मूल्य का मूल्य हो जिसे आप कार्य करना चाहते हैं, बस इसका उपयोग करें और जो भी आप चाहते हैं उसे करें। –

उत्तर

8

producer/consumer pattern का उपयोग करें: रननेबल put इसका परिणाम BlockingQueue पर है। कतार से एक और धागा 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) 
      { 
      } 
     } 
    }; 
} 

तो फिर तुम पारित कर सकते हैं अपने Callable जब आप ScheduledExecutroService को प्रस्तुत करना चाहते हैं:

ses.scheduleAtFixedRate(runnableOf(callabale), initialDelay, delay, unit); 
संबंधित मुद्दे