2013-09-24 7 views
5

चूंकि गुवा की ListeningExecutorService को मौजूदा एक्जिक्यूटर्स सेवा को लपेटकर कार्यान्वित किया जाता है, यह निष्पादन() विधि को रोककर कार्य को 'सजाने' देता है। इसका मतलब है कि अगर मैं अंतर्निहित एक्जिक्यूटर्स सेवा पर एक कस्टम प्राथमिकता क्यूई का उपयोग करना चाहता हूं, तो मेरा तुलनित्र मूल के बजाए सजाए गए फ़्यूचरटास्क ऑब्जेक्ट के रूप में सजाए गए कार्य को "देखता है"।मैं ListeningExecutorService के साथ प्राथमिकताब्लॉकिंग क्यूयू का उपयोग कैसे कर सकता हूं?

क्या यह कार्य करने के लिए कोई तरीका है जो इसे लपेटता है? ताकि कतार का तुलनित्र ऑर्डरिंग निर्धारित करने के लिए कार्य वजन का उपयोग कर सके?

उत्तर

4

मुझे लगता है कि execute() के बजाय आप submit() से चिंतित हैं? (मेरी प्रतिक्रिया के नीचे देखें।)

ListeningExecutorServiceMoreExecutors.listeningDecorator (जिस प्रकार का रैपर आप संदर्भित करते हैं) से, आप भाग्य से बाहर हैं। listeningDecorator, अधिकांश ExecutorService कार्यान्वयन की तरह, submit पर किसी भी इनपुट को FutureTask में लपेटता है। इस समस्या का सामान्य समाधान AbstractExecutorService को लागू करना है और कस्टम ऑब्जेक्ट को वापस करने के लिए newTaskFor ओवरराइड करना है। यह भी यहां काम करना चाहिए। आप मूल रूप से listeningDecorator को फिर से कार्यान्वित कर देंगे, जो AbstractListeningExecutorService के आस-पास एक काफी छोटा रैपर है, जो AbstractExecutorService के आस-पास एक काफी छोटा आवरण है।

दो जोड़े जटिलताओं हैं। (ठीक है, वहाँ अधिक हो सकता है। मैं मानता हूं कि मैं दृष्टिकोण मैं सुझाव दे रहा हूँ परीक्षण नहीं किया।)

  1. AbstractListeningExecutorService आप newTaskFor ओवरराइड करने के लिए अनुमति नहीं है। (क्यों? अगर आप file a feature request करना चाहते हैं तो मैं समझा सकता हूं।) परिणामस्वरूप, आपको AbstractExecutorService सीधे का विस्तार करना होगा, जो बड़े पैमाने पर (लघु) AbstractListeningExecutorService कार्यान्वयन को डुप्लिकेट कर रहा है।
  2. newTaskFor को ListenableFuture वापस करना होगा जो Comparable भी है। ListenableFuture के लिए स्पष्ट विकल्प ListenableFutureTask है, लेकिन वह वर्ग final है, इसलिए आप Comparable उदाहरण नहीं दे सकते। समाधान ListenableFutureTask और को SimpleForwardingListenableFuture में लपेटना है जो Comparable लागू करता है।

मैं क्यों मान तुम submit() बजाय execute() के साथ काम कर रहे हैं?

public void testListeningDecorator_noWrapExecuteTask() { 
    ExecutorService delegate = mock(ExecutorService.class); 
    ListeningExecutorService service = listeningDecorator(delegate); 
    Runnable task = new Runnable() { 
    @Override 
    public void run() {} 
    }; 
    service.execute(task); 
    verify(delegate).execute(task); 
} 
:

listeningDecorator(...).execute() के रूप में इस परीक्षण मैं सिर्फ लिखा था द्वारा दिखाए गए, इनपुट कार्य लपेट नहीं करता

संबंधित मुद्दे