2009-06-05 15 views
6

मैं समस्या को हल करने के लिए जावा में एक काफी मानक तंत्र है में प्रवास:जावा संगामिति से स्काला संगामिति

  • कार्य आइटम एक विशेष समय
  • पर अमल करने के लिए निर्धारित किया जाना चाहिए प्रत्येक कार्य आइटम तब तक प्रतीक्षा करनी होगी एक शर्त सच
  • कार्य आइटम बनने रद्द

इस प्रकार समाधान मैं का उपयोग कर रहा है के रूप में किया जाना चाहिए:

  1. मेरे काम
  2. आइटम शेड्यूल करने के लिए एक एकल पिरोया अनुसूचक है एक ExecutorService (मल्टी-थ्रेडेड हो सकता है)
  3. प्रत्येक निर्धारित कार्य आइटम तो ExecutorService को वास्तविक कार्य सबमिट करता है। लौटा Future मानचित्र में कैश किया गया है। एक पूरा होने सेवा जब काम पूरा हो गया है
  4. आइटम कैश की गई वायदा
बेशक

के माध्यम से रद्द किया जा सकता कैश से भविष्य को दूर करने के लिए किया जाता है, मेरे निष्पादक की संख्या के रूप में कम से कम के रूप में बड़ा होने की जरूरत है काम की वस्तुओं को अवरुद्ध करना मुझे उम्मीद है लेकिन यह अभ्यास में कोई समस्या नहीं है।

तो अब मैं स्कैला में कोडिंग कर रहा हूं और अभिनेता ढांचे का उपयोग कर रहा हूं। यह मानते हुए कि मेरे काम आइटम एक घटना एक अभिनेता के लिए भेजा में समझाया जा सकता है:

  1. क्या तंत्र मैं एक विशेष समय के लिए एक कार्य आइटम शेड्यूल करने के लिए प्रयोग करेंगे?
  2. यदि कोई कार्य आइटम किसी अभिनेता को भेजा गया एक ईवेंट है, तो मैं यह कैसे सुनिश्चित कर सकता हूं कि बैकिंग थ्रेड पूल एक ही समय में अवरुद्ध हो सकता है जो
  3. मैं पहले निर्धारित समय का कारण कैसे बना सकता हूं आइटम रद्द किया जाना है?
+0

क्या आप "एक शर्त सच होने" का विस्तार कर सकते हैं? क्या यह वैश्विक राज्य है? क्या यह I/O है? – Apocalisp

+0

मेरा मतलब है कि काम के हिस्से के रूप में, प्रक्रिया को कुछ हो रहा है (जैसे फ़ाइल आने वाली) पर अवरुद्ध करना पड़ सकता है –

उत्तर

5

एक विशिष्ट समय के लिए कार्य आइटम निर्धारित करने के लिए मैं किस तंत्र का उपयोग करूंगा?

मैं एक java.util.concurrent.ScheduledExecutorService का उपयोग करूंगा।

तो एक काम मद एक अभिनेता के लिए भेजा एक घटना, मैं कैसे सुनिश्चित कर सकते हैं कि समर्थन थ्रेड पूल आइटम्स की संख्या है कि एक ही समय में अवरुद्ध किया जा सकता है

इस हमले से भी बड़ा है मुझे एक ऐसे डिजाइन के रूप में जो समांतरता के प्रयास को हरा देता है। अवरुद्ध करने और वैश्विक स्थिति को कम करने या समाप्त करने का प्रयास करें। ये composability और स्केलेबिलिटी के लिए बाधाएं हैं। उदाहरण के लिए, एक समर्पित थ्रेड होने पर विचार करें जो फ़ाइलों तक पहुंचने की प्रतीक्षा करता है और फिर कलाकारों को घटनाओं को बंद कर देता है। या asynchronous गैर-अवरुद्ध I/O के लिए java.nio को देखो।

मैं यहां आपकी आवश्यकताओं को पूरी तरह से समझ नहीं पा रहा हूं, लेकिन ऐसा लगता है कि आपके पास एक एकल थ्रेड/अभिनेता आई/ओ कार्यक्रमों की तलाश में हो सकता है। फिर आपके निर्धारित "काम आइटम" के रूप में, शेड्यूल प्रभाव जो गैर-अवरुद्ध कलाकार बनाते हैं। क्या उन कलाकारों ने आई/ओ थ्रेड/अभिनेता के साथ खुद को आई/ओ कार्यक्रमों के बारे में संदेश प्राप्त करने के लिए पंजीकृत किया है जिनकी वे परवाह करते हैं।

मैं पहले से निर्धारित कार्य आइटम को रद्द करने का कारण कैसे बना सकता हूं?

ScheduledExecutorService फ़्यूचर्स लौटाता है। आपके पास जो संबंध है वह उस संबंध में खराब डिजाइन नहीं है। उन्हें मानचित्र में एकत्र करें और भविष्य.cancel() पर कॉल करें।

+0

आप "अवरुद्ध कार्य" मॉडल के बारे में पूरी तरह से सही हैं और मैं काफी समान हूं खुद को निष्कर्ष निकाला लेकिन एक पूर्ण पुनः लिखना बंद कर रहा था। हालांकि मैं अंत में शुक्रवार को ऐसा करने के लिए चारों ओर मिल गया और अब एक बेहतर प्रणाली है –

1

आपके पास एक शेड्यूलिंग अभिनेता हो सकता है जिसमें अनुसूचित अभिनेताओं की एक सूची हो और Actor.receiveWithin() का उपयोग हर दूसरे या उससे आगे उठने के लिए किया जाए और उन कलाकारों को संदेश भेजें जो निष्पादित करने के लिए तैयार हैं। शेड्यूलिंग अभिनेता रद्द करने को भी संभाल सकता है। एक अन्य विकल्प यह है कि प्रत्येक अभिनेता को शेड्यूलिंग को केंद्रीकृत करने के बजाय, व्हाइथिन() के साथ सीधे अपने शेड्यूलिंग को संभालने दें।

ब्लॉग पोस्ट Simple cron like scheduler in Scala में इस मुद्दे पर कुछ चर्चा है।

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