अद्यतन: यहां my implementation of Hashed Timing Wheels है। यदि आपको प्रदर्शन और समरूपता में सुधार करने का कोई विचार है तो कृपया मुझे बताएं। (20-जनवरी-2009)एक प्राथमिकता कतार जो कुशल प्राथमिकता अद्यतन की अनुमति देता है?
// Sample usage:
public static void main(String[] args) throws Exception {
Timer timer = new HashedWheelTimer();
for (int i = 0; i < 100000; i ++) {
timer.newTimeout(new TimerTask() {
public void run(Timeout timeout) throws Exception {
// Extend another second.
timeout.extend();
}
}, 1000, TimeUnit.MILLISECONDS);
}
}
अद्यतन: मैं Hierarchical and Hashed Timing Wheels का उपयोग कर इस समस्या का समाधान। (1 9-जनवरी -2009)
मैं जावा में एक विशेष उद्देश्य टाइमर को कार्यान्वित करने की कोशिश कर रहा हूं जिसे टाइमआउट हैंडलिंग के लिए अनुकूलित किया गया है। उदाहरण के लिए, कोई उपयोगकर्ता एक मृत रेखा के साथ एक कार्य पंजीकृत कर सकता है और टाइमर मृत लाइन खत्म हो जाने पर उपयोगकर्ता की कॉलबैक विधि को सूचित कर सकता है। ज्यादातर मामलों में, एक पंजीकृत कार्य बहुत ही कम समय के भीतर किया जाएगा, इसलिए अधिकांश कार्यों को रद्द कर दिया जाएगा (उदाहरण के लिए task.cancel()) या भविष्य में पुन: निर्धारित (जैसे task.rescheduleToLater (1, TimeUnit.SECOND)) ।
मैं एक निष्क्रिय सॉकेट कनेक्शन का पता लगाने के लिए इस टाइमर का उपयोग करना चाहता हूं (उदाहरण के लिए 10 सेकंड में कोई संदेश प्राप्त नहीं होने पर कनेक्शन बंद करें) और टाइमआउट लिखें (उदाहरण के लिए 30 सेकंड में लिखना ऑपरेशन समाप्त नहीं होने पर अपवाद उठाएं।) ज्यादातर मामलों में, टाइमआउट नहीं होगा, क्लाइंट एक संदेश भेजेगा और प्रतिक्रिया तब तक भेजी जाएगी जब तक कोई अजीब नेटवर्क समस्या न हो ..
मैं java.util.Timer या java.util.concurrent का उपयोग नहीं कर सकता। अनुसूचित थ्रेडपूल एक्स्सेलर क्योंकि वे मानते हैं कि अधिकांश कार्यों का समय समाप्त होना चाहिए। यदि कोई कार्य रद्द कर दिया गया है, तो रद्द किए गए कार्य को अपने आंतरिक ढेर में तब तक संग्रहीत किया जाता है जब तक शेड्यूल किए गए थ्रेडपूलएक्ससेलर.पुर्ज() को कॉल नहीं किया जाता है, और यह एक बहुत महंगा ऑपरेशन है। (ओ (एनएलएलएन) शायद?)
परंपरागत ढेर या प्राथमिकता कतारों में मैंने अपने सीएस वर्गों में सीखा है, तत्व की प्राथमिकता को अद्यतन करना कई मामलों में एक महंगा ऑपरेशन (ओ (लॉगएन) था क्योंकि यह केवल हो सकता है तत्व को हटाकर और इसे एक नई प्राथमिकता मान के साथ दोबारा डालने से हासिल किया गया। कुछ ही ढेर जैसे फिबोनाची ढेर में ओ (1) कमी का समय() और मिनट() ऑपरेशन है, लेकिन मुझे कम से कम क्या चाहिए तेज़ वृद्धि() और मिनट() (या कमी)() और अधिकतम())
क्या आप किसी भी डेटा संरचना को जानते हैं जो इस विशेष उपयोग के मामले के लिए अत्यधिक अनुकूलित है? एक रणनीति जो मैं सोच रहा हूं वह सिर्फ हैश टेबल में सभी कार्यों को संग्रहीत कर रही है और हर दूसरे या तो सभी कार्यों को फिर से चालू करना, लेकिन यह सुंदर नहीं है।
ओ (लॉगएन) अपडेट क्यों धीमा हो जाएगा? – ConcernedOfTunbridgeWells
क्योंकि अद्यतन बहुत बार होता है। मान लीजिए कि हम प्रति कनेक्शन एम संदेश भेज रहे हैं तो समग्र समय ओ (एमएनएलओएनएन) बन जाता है, जो कि काफी बड़ा है। – trustin
मैं आपकी समस्या को स्पष्ट रूप से समझ नहीं पाया। क्या आप फिर से बदल सकते हैं? – user51568