2013-01-18 14 views
6

में किसी कार्य का समय निर्धारित करना मैं काफी जावा के लिए नया हूँ और मैं 5 से 10 के बीच के क्षेत्र में किसी भी अंतराल पर, कि हर 5 से 10 सेकंड चलेंगे एक कार्य उत्पन्न करने के लिए कोशिश कर रहा हूँ तो, 10 भी शामिल है।जावा: यादृच्छिक अंतराल

मैं कई चीजें कोशिश की, लेकिन अभी तक कुछ भी काम कर रहा है। मेरा नवीनतम प्रयास नीचे है:

timer= new Timer(); 
Random generator = new Random(); 
int interval; 

//The task will run after 10 seconds for the first time: 
timer.schedule(task, 10000); 

//Wait for the first execution of the task to finish:    
try { 
    sleep(10000); 
} catch(InterruptedException ex) { 
ex.printStackTrace(); 
} 

//Afterwards, run it every 5 to 10 seconds, until a condition becomes true: 
while(!some_condition)){ 
    interval = (generator.nextInt(6)+5)*1000; 
    timer.schedule(task,interval); 

    try { 
     sleep(interval); 
    } catch(InterruptedException ex) { 
    ex.printStackTrace(); 
    } 
} 

"कार्य" एक टाइमरटास्क है। क्या मैं मिलता है:

Exception in thread "Thread-4" java.lang.IllegalStateException: Task already scheduled or cancelled 

मैं here कि एक TimerTask पुन: उपयोग नहीं किया जा सकता से समझते हैं, लेकिन मुझे यकीन है कि यह कैसे तय करने के लिए नहीं कर रहा हूँ। जिस तरह से मेरा टाइमरटास्क काफी विस्तृत है और कम से कम 1,5 सेकंड तक रहता है।

किसी भी मदद वास्तव में सराहना की जाएगी, धन्यवाद!

उत्तर

12

कोशिश

public class Test1 { 
    static Timer timer = new Timer(); 

    static class Task extends TimerTask { 
     @Override 
     public void run() { 
      int delay = (5 + new Random().nextInt(5)) * 1000; 
      timer.schedule(new Task(), delay); 
      System.out.println(new Date()); 
     } 

    } 

    public static void main(String[] args) throws Exception { 
     new Task().run(); 
    } 
} 
+1

काम करने लगता है, धन्यवाद! – menackin

1

बजाय प्रत्येक कार्य के लिए एक नया Timer बनाएँ, जैसे आप पहले से ही कार्य करें: timer= new Timer();

और अगर आप अपने थ्रेड किए कार्यों के साथ अपने कोड सिंक्रनाइज़ सेमाफोर का उपयोग करें और नहीं sleep(10000) करना चाहते हैं। यदि आप भाग्यशाली हैं तो यह काम कर सकता है, लेकिन यह निश्चित रूप से गलत है क्योंकि आप यह सुनिश्चित नहीं कर सकते कि आपका कार्य वास्तव में समाप्त हो गया है।

+0

आपके उत्तर के लिए धन्यवाद। मेरे पास सिर्फ एक कार्य है जो एक के बाद एक पूर्वनिर्धारित संख्या को चलाएगा। क्या आपको लगता है कि मुझे अभी भी सेमफोर का उपयोग करने की ज़रूरत है? साथ ही, यदि मैं प्रत्येक बार कार्य चलाने के लिए एक नया टाइमर बनाता हूं, तो क्या इसका मतलब है कि मुझे टाइमर या उस तरह की कुछ चीज चाहिए? – menackin

+0

आपने कहा था कि आप पहले कार्य को समाप्त करना चाहते हैं। यह एक सेमफोर की जरूरत है। यदि आप नहीं चाहते हैं तो आपको टाइमर का ट्रैक रखने की आवश्यकता नहीं है। बाद में जीसी द्वारा उन्हें स्वचालित रूप से मुक्त कर दिया जाएगा। – m0skit0

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