मुझे अपनी समस्या के लिए एक अच्छा प्रश्न शीर्षक नहीं मिला।

मेरे पास एक श्रोता है जो ईवेंट प्राप्त करता है, प्रत्येक ईवेंट में ऑब्जेक्ट आईडी होता है। क्योंकि कुछ क्रियाओं को संसाधित होने में कुछ समय लगता है, मैं एक निश्चित थ्रेड पूल निष्पादक (10 थ्रेड्स के साथ) के लिए एक सिंक्रोनस प्रोसेसिंग (जहां मैं एक समय में प्रत्येक घटना का इलाज करता हूं, श्रोता को लॉक करता हूं) पर स्विच करता हूं।

समस्या यह है कि किसी विशिष्ट ऑब्जेक्ट आईडी के लिए, मैं अभी भी घटनाओं को उसी क्रम में संसाधित करना चाहता हूं जिससे ईवेंट उत्सर्जित होते हैं।

समस्या यह है कि ऑब्जेक्ट आईडी यादृच्छिक है, मैं प्रत्येक ऑब्जेक्ट आईडी के लिए थ्रेड को पूर्व-घोषित नहीं कर सकता।

अगर मैं इसे सरल बनाना चाहता हूं: मान लें कि मेरे पास धागे की एक सरणी है, आईडी 0 के साथ प्रत्येक ईवेंट को इंडेक्स 0 पर थ्रेड के माध्यम से माना जाएगा, और प्रत्येक ईवेंट के लिए 1 के साथ उन्हें इंडेक्स 1 पर थ्रेड के माध्यम से माना जाएगा।

यह अच्छी तरह से काम करता है अगर आईडी 0 से 10 की सीमा के भीतर है, लेकिन यह मेरा मामला नहीं है, उनके पास कोई अंतर मूल्य हो सकता है।

0
iXô 10 सितंबर 2020, 18:20

1 उत्तर

सबसे बढ़िया उत्तर

ऑब्जेक्ट आईडी की घटनाओं को संसाधित करने के लिए आपको यह सुनिश्चित करना होगा कि यह प्रसंस्करण के लिए एक ही थ्रेड पर आ रहा है। ऐसा करने के लिए आप जो कर सकते हैं वह यह है कि आप ऑब्जेक्ट आईडी के हैश की गणना कर सकते हैं और फिर इसे आपके पास मौजूद थ्रेड्स की संख्या से संशोधित कर सकते हैं जो सुनिश्चित करेगा कि एक ही ऑब्जेक्ट आईडी को उसी थ्रेड या उसी थ्रेडपूल द्वारा संसाधित किया जाता है।

int objectIdHash = objectId.hashCode();
    
return (objectIdHash % totalThreads);

अब प्रसंस्करण के लिए धागे या थ्रेडपूल को स्टोर करने के लिए आप समवर्ती हैश मैप का उपयोग कर सकते हैं।

// Define the thread pool
private Map<Integer, ExecutorService> threadPool = new ConcurrentHashMap<Integer, ExecutorService>();

// Get the thread id using the above
int threadId = getJobThreadPoolId(objectId, totalThreads);

// Get the thread from the threadpool and submit
threadpool.get(threadId).submit(event);
2
Prateek Jain 10 सितंबर 2020, 22:52