2012-07-11 13 views
8

मैं ओ धागे (उदाहरण के लिए: 2012-07-11 13:12:24 और 2012-07-11 15:23:45) विशिष्ट सही समय पर निष्पादित करना चाहते हैंजावा में विशिष्ट समय पर चलाने के लिए थ्रेड को कैसे कॉल करें?

मैं ScheduledExecutorService जाँच की, लेकिन यह केवल पहले रन से विशिष्ट अवधि के बाद निष्पादन का समर्थन करता है और मेरे पास कोई निश्चित अवधि नहीं है, इसके बजाय मेरे पास डेटाबेस से कार्य निष्पादित करने के लिए समय है।

एक अलग समस्या here के लिए एक पिछले प्रश्न में, TimerTask समाधान था, लेकिन Obviuosly मैं थ्रेड दोनों विधि run जो कार्यान्वित किए जाने की आवश्यकता है एक TimerTaskRunnable के रूप में और TimerTask नहीं कर सकता। यहां प्रश्न अगर मैं धागा TimerTask बढ़ाता हूं और run() का कार्यान्वयन करता हूं, तो क्या यह काम करेगा? यदि नहीं, तो क्या करना संभव है कि मैं क्या करने की कोशिश कर रहा हूं?

+1

अपने समाधान को दोबारा दोहराएं ताकि आप अपना खुद का धागा न बनाएं। इसके बजाय 'टाइमर टास्क' बढ़ाएं। –

+0

@ मार्कोटोपॉलिक जो संघर्ष को हल करेगा .. लेकिन वास्तव में मुझे धागे की आवश्यकता है क्योंकि मेरे पास कई कार्य होंगे (चार प्रकार के कार्य होते हैं) और मैं चाहता हूं कि प्रत्येक कार्य को थ्रेड में अलग से निष्पादित किया जाए। – Sami

+1

फिर एक पतला 'टाइमरटास्क 'रैपर बनाएं जिसमें आपके' थ्रेड 'को एक आवृत्ति var के रूप में शामिल किया गया हो और निर्धारित समय पर आपका धागा' प्रारंभ 'होगा। आप एक अनाम 'टाइमरटास्क' उप-वर्ग का उपयोग भी कर सकते हैं जो स्थानीय var पर बंद करके 'थ्रेड' को देखता है। और अब मैं देखता हूं कि @AkhilDev नीचे प्रस्तावित कर रहा है :) –

उत्तर

11

टाइमरटास्क का उपयोग करें।

अपने थ्रेड के रूप में फ़ील्ड चर के साथ टाइमरटास्क ऑब्जेक्ट बनाएं। टाइमर कार्य रन विधि से थ्रेड प्रारंभ करें कॉल करें।

public class SampleTask extends TimerTask { 
    Thread myThreadObj; 
    SampleTask (Thread t){ 
    this.myThreadObj=t; 
    } 
    public void run() { 
    myThreadObj.start(); 
    } 
} 

इसे इस तरह कॉन्फ़िगर करें।

Timer timer new Timer(); 
Thread myThread= // Your thread 
Calendar date = Calendar.getInstance(); 
date.set(
    Calendar.DAY_OF_WEEK, 
    Calendar.SUNDAY 
); 
date.set(Calendar.HOUR, 0); 
date.set(Calendar.MINUTE, 0); 
date.set(Calendar.SECOND, 0); 
date.set(Calendar.MILLISECOND, 0); 
// Schedule to run every Sunday in midnight 
timer.schedule(
    new SampleTask (myThread), 
    date.getTime(), 
    1000 * 60 * 60 * 24 * 7 
); 
+0

मैं इस को लागू करने की कोशिश कर रहा हूँ, लेकिन अगर मैं दो बार एक ही समय में एक ही काम अनुसूची क्या होगा? उदाहरण के लिए, मैंने अब उचित कार्यों के लिए चेक किया है और टी 1 पाया है। एक मिनट के बाद टी 1 अभी भी देय था .. तो यह इसके समय के साथ निर्धारित हो गया..क्या यह दो बार निष्पादित किया जा रहा है? – Sami

+1

उस परिदृश्य वास्तव में जिस तरह से मैं डेटाबेस से कार्य प्राप्त करने में कठिनाई हूँ का एक परिणाम हो सकता है .. मैं एक धागा जो executerService का उपयोग कर हर मिनट चलाता है, कि धागा किसी भी कार्य है कि अगले एक मिनट में कारण हो और उन्हें लाने के लिए लग रहा है की है। अगर काम है कि जांच के बाद केवल एक दूसरा कारण है, यह फ़ेचर धागे की अगली निष्पादन के लिए विचार किया जाएगा .. लेकिन के रूप में यह धागा समय प्राप्त करने में कठिनाई के बाद एक सेकंड में कारण हो जाएगा, यह क्रियान्वित किया जा सकता है या यहाँ तक कि देर से अनुसूचित। यह कैसे सुधार किया जा सकता है? – Sami

+0

कार्य के 2 उदाहरणों, अलग अलग समय और समय दोनों मामलों के साथ विन्यस्त पैदा करते हैं। –

4

मुझे लगता है कि आपको Quartz Scheduler जैसी कुछ लाइब्रेरी का बेहतर उपयोग करना चाहिए। यह मूल रूप से जावा के लिए क्रॉन का कार्यान्वयन है।

1

क्या आपने java.util.concurrent पैकेज से CountDownLatch पर देखा है? यह एक गिनती प्रदान करता है फिर थ्रेड (ओं) को चलाने के लिए ट्रिगर करता है। मुझे इसे स्वयं इस्तेमाल करने की आवश्यकता नहीं थी, लेकिन इसे दो बार उपयोग में देखा है।

+0

अनुरोधित समय पर केवल 'थ्रेड.स्टार्ट' को कॉल करना आसान होगा। –

+0

क्या होगा यदि उसके पास एक से अधिक 'थ्रेड' है जिसे उसे एक साथ किकस्टार्ट करने की आवश्यकता है? – posdef

+0

ए 'फॉर लूप वहां मदद कर सकता है। (बीटीडब्ल्यू आपको कम नहीं कर रहा है)। –

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