2012-08-01 11 views
5

में चलने योग्य ऑब्जेक्ट्स मेरे पास एक एकल थ्रेड पूल निष्पादक सेवा ऑब्जेक्ट है। कुछ समय में सबमिट() विधि का उपयोग कर भविष्य के कार्यों को जोड़ा जाना चाहिए। मेरी समझ यह है कि जमा सबमिट किए जाने वाले कार्यों की सूची के अंत में प्रस्तुत किए गए रननेबल को सबमिट कर देगा। हालांकि मेरे पास एक ऐसी स्थिति है जहां एक बुलियन पर आधारित है, मैं निष्पादित किए जाने वाले कार्यों के सामने भागने योग्य प्रस्तुत करना चाहता हूं। मैं नहीं चाहता कि यह वर्तमान कार्य को प्रभावित करे, सिर्फ अगला कार्य किया जाएगा जिसे मैंने अभी दिया है। एक उदाहरण विधि नीचे पुन: उत्पन्न की जाती है। मैं यह कैसे करु?जावा इंटरजेक्ट निष्पादन योग्य सेवा

धन्यवाद

private ExecutorService singleLoadPool = Executors.newSingleThreadExecutor(); 
public void submitTask(Runnable run, boolean doNow) { 
    if (doNow) 
     singleLoadPool.submitFront(run); // This is the method I'm looking for 
    else 
     singleLoadPool.submit(run); 
} 

उत्तर

4

मेरी प्राथमिकता LinkedBlockingDeque का उपयोग करेगी। यह सीधे स्थितित्मक आवेषण/हटा देता है - putFirst(e)/takeFirst() और putLast(e)/takeLast() - जो आपकी प्राथमिक आवश्यकता है- आपको अपने तत्वों के लिए Comparator लागू करने की आवश्यकता नहीं है। इसके अलावा यह बाध्य है - जिसका मतलब है कि यह OutOfMemoryError के खिलाफ सुरक्षा प्रदान करता है।

नवीनतम प्रश्न के उत्तर में संपादित करें: workQueue क्या है:

सबसे पहले, की तरह

ExecutorService executorService = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, workQueue);

दूसरा, महत्वपूर्ण सवाल है ExecutorService है?

workQueue किसी भी BlockingQueue कार्यान्वयन पर एक पतली आवरण है, जो एक LinkedBlockingDeque उदाहरण के प्रतिनिधियों ने अपने सभी तरीकों है कि यह होता है, offer() विधि है, जो ThreadPoolExecutor द्वारा इस पर कहा जाता है और जो जरूरत के लिए छोड़कर, ओवरराइड किया जा करने के लिए की तरह है इस:

 public boolean offer(E e) { 
     if(doNow) 
     return linkedBlockingDequeInstance.offerFirst(e); 
     else 
     return linkedBlockingDequeInstance.offerLast(e); 
    } 

बेशक जब आप किसी भी विधि को ओवरराइड - आप सावधान करने के लिए धागा सुरक्षा और अपने सामान्य contract.Definitely इस सावधान सोचा और कठोर परीक्षण की आवश्यकता है बनाए रखने की जरूरत है।

+0

यह वही है जो मुझे चाहिए, धन्यवाद – Jon

+0

मेरे समाधान से बेहतर :) –

+0

तो मैं बस इसे लागू करने जा रहा था और एक और सवाल है, मैं कतार में नौकरियां कैसे जोड़ूं? क्या मुझे ThreadPoolExecutor को ओवरराइड करना है क्योंकि मैं केवल लिंक किए गए ऑब्जेक्ट को LinkedBlockingDeque में नहीं जोड़ सकता? – Jon

1

मुझे लगता है कि इस बात के लिए अपने सबसे अच्छा तरीका एक PriorityBlockingQueue साथ instantiate a ThreadPoolExecutor होगा। विशेष रूप से, प्राथमिकताब्लॉकिंग क्यू कन्स्ट्रक्टर का उपयोग करें जो Comparator लेता है। आपकी Comparator वह होगी जो आप अपनी 'प्राथमिकता' को लागू करने के लिए उपयोग करते हैं।

PriorityBlockingQueue<Runnable> workQueue = new PriorityBlockingQueue<Runnable>(20, yourPriorityComparator); 
ExecutorService executorService = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, workQueue); 
+0

प्रतिक्रिया के लिए धन्यवाद, क्या आप प्राथमिकता नियंत्रक का उदाहरण प्रदान कर सकते हैं? – Jon

+0

'तुलनाकर्ता' इंटरफ़ेस पर एक नज़र डालें (अब उत्तर में जुड़ा हुआ है)। आपको अपने स्वयं के 'तुलनाकर्ता' को लागू करने की आवश्यकता होगी, लेकिन यह अपेक्षाकृत सीधा होना चाहिए। –

+0

मेरी समस्या यह है कि मुझे समझ में नहीं आता कि मेरे बुलियन को तुलनात्मक में कैसे प्राप्त किया जाए। संकलन करने के लिए मुझे निम्नलिखित हस्ताक्षर निजी वर्ग RunnableComparator लागूकर्ता के साथ एक कक्षा बनाने की आवश्यकता है लागू करता है। तुलनात्मक को रननेबल प्रकारों की तुलना करने की आवश्यकता है और रननेबल को लागू करने वाले वर्गों की तुलना नहीं कर सकते हैं और केवल 1 तुलनात्मक हो सकता है जिसे निष्पादक सेवा को तुरंत चालू किया जा सकता है, इसलिए डूनो बूलियन इसे पास नहीं किया जा सकता है। – Jon

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