मुझे लगता है कि execute()
के बजाय आप submit()
से चिंतित हैं? (मेरी प्रतिक्रिया के नीचे देखें।)
ListeningExecutorService
MoreExecutors.listeningDecorator
(जिस प्रकार का रैपर आप संदर्भित करते हैं) से, आप भाग्य से बाहर हैं। listeningDecorator
, अधिकांश ExecutorService
कार्यान्वयन की तरह, submit
पर किसी भी इनपुट को FutureTask
में लपेटता है। इस समस्या का सामान्य समाधान AbstractExecutorService
को लागू करना है और कस्टम ऑब्जेक्ट को वापस करने के लिए newTaskFor
ओवरराइड करना है। यह भी यहां काम करना चाहिए। आप मूल रूप से listeningDecorator
को फिर से कार्यान्वित कर देंगे, जो AbstractListeningExecutorService
के आस-पास एक काफी छोटा रैपर है, जो AbstractExecutorService
के आस-पास एक काफी छोटा आवरण है।
दो जोड़े जटिलताओं हैं। (ठीक है, वहाँ अधिक हो सकता है। मैं मानता हूं कि मैं दृष्टिकोण मैं सुझाव दे रहा हूँ परीक्षण नहीं किया।)
AbstractListeningExecutorService
आप newTaskFor
ओवरराइड करने के लिए अनुमति नहीं है। (क्यों? अगर आप file a feature request करना चाहते हैं तो मैं समझा सकता हूं।) परिणामस्वरूप, आपको AbstractExecutorService
सीधे का विस्तार करना होगा, जो बड़े पैमाने पर (लघु) AbstractListeningExecutorService
कार्यान्वयन को डुप्लिकेट कर रहा है।
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()
के रूप में इस परीक्षण मैं सिर्फ लिखा था द्वारा दिखाए गए, इनपुट कार्य लपेट नहीं करता
स्रोत
2013-09-25 15:39:00