2011-12-20 16 views
11

मुझे थ्रेड & के माध्यम से हर मिनट एक टेबल से डेटा को पढ़ने की आवश्यकता है, फिर कुछ क्रियाएं करें।जावा में वर्कर थ्रेड

क्या मुझे केवल एक थ्रेड शुरू करना चाहिए & कार्य पूरा होने के बाद इसे 1 मिनट के लिए नींद मोड में डालना चाहिए। और फिर फिर से जांचें कि तालिका में कोई डेटा है या नहीं, फिर से कार्य करें & 1 मिनट के लिए सो जाओ ...

क्या यह सही दृष्टिकोण है? क्या कोई मुझे ऐसा करने के लिए जावा में कुछ नमूना कोड प्रदान कर सकता है?

धन्यवाद!

उत्तर

20

जैसा कि अक्सर, java.util.concurrent पैकेज से जावा 5 एक्सटेंशन एक विशाल मदद यहाँ हैं।

आपको ScheduledThreadPoolExecutor का उपयोग करना चाहिए। यहां एक छोटा (untestet) उदाहरण है:

class ToSomethingRunnable implements Runnable { 
    void run() { 
     // Add your customized code here to update the contents in the database. 
    } 
} 

ScheduledThreadPoolExecutor executor = Executors.newScheduledThreadPool(1); 
ScheduledFuture<?> future = executor.scheduleAtFixedRate(new ToSomethingRunnable(), 
    0, 1, TimeUnit.MINUTES); 

// at some point at the end 
future.cancel(); 
executor.shutdown(); 

अद्यतन:

एक निर्वाहक का उपयोग कर आप सभी को साझा करने के लिए एक ही ThreadPool एक सरल विभिन्न अंतरालों के कई दोहरा कार्य जोड़ सकते हैं है का एक लाभ है, लेकिन नियंत्रित शटडाउन।

+1

+1: 'newScheduledTreadPool (1)' = 'newSingleThreadScheduledExecutor()' और 'execor.shutdown() 'सभी सक्रिय कार्यों को रद्द कर देगा। –

+1

एक निष्पादक का उपयोग करने का लाभ यह है कि आप एक ही धागे को साझा करने वाले विभिन्न अंतराल के कई दोहराने वाले कार्यों को जोड़ सकते हैं। (और सरल शट डाउन) –

+0

@ पीटर लेवरी: आप सही हैं। मैंने जवाब में शामिल किया। – dmeister

0

आपका दृष्टिकोण अच्छा है। आप अपना दृष्टिकोण आगे बढ़ा सकते हैं।

यह नमूना मदद मिलेगी अपने काम करने के लिए:

class SimpleThread extends Thread { 
    public SimpleThread(String str) { 
    super(str); 
    } 
    public void run() { 
    for (int i = 0; i < 10; i++) { 
     System.out.println(i + " " + getName()); 
     try { 
      // Add your customized code here to update the contents in the database. 

      sleep((int)(Math.random() * 1000)); 

     } catch (InterruptedException e) {} 
    } 
    System.out.println("DONE! " + getName()); 
} 
} 
+0

के रूप में किसी को java.util.concurrent पैकेज से जावा 5 एक्सटेंशन सुझाव बेहतर होते हैं चाहते हो सकता है इस समस्या के समाधान। – dendini

1

एक धागा खुद ExcecutorService, जहां और scheduleAtFixedRate हस्ताक्षर हैं आकार का एक thred पूल बनाता है उपयोग करने के लिए है बनाने के लिए एक वैकल्पिक : scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);

public class ScheduledDBPoll 
{ 
    public static void main(String[] args) 
    { 
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
    ScheduledFuture<?> sf = scheduler.scheduleAtFixedRate(
     new Runnable() { 
      public void run() { 
      pollDB(); 
      } 
     }, 
     1, 60,TimeUnit.SECONDS); 
    } 
} 
0

"मैं सिर्फ आरंभ करना चाहिए एक धागा & 1 मिनट के लिए स्लीप मोड में रख" यहां तक ​​कि अगर आप (न निष्पादक का उपयोग करना चाहते Fremework) पारंपरिक धागा साथ जाने के लिए यह रूप में उद्देश्य इंतजार कर के लिए सोने का उपयोग न करें चाहते हैं लॉक जारी नहीं करेगा और यह एक अवरुद्ध ऑपरेशन होगा। यहां प्रतीक्षा करें (टाइमआउट) का उपयोग करें।

गलत दृष्टिकोण -

public synchronized void doSomething(long time) throws InterruptedException { 
    // ... 
    Thread.sleep(time); 
} 

सही दृष्टिकोण

public synchronized void doSomething(long timeout) throws InterruptedException { 
// ... 
    while (<condition does not hold>) { 
    wait(timeout); // Immediately releases the current monitor 
    } 
} 

आप लिंक की जाँच करने के https://www.securecoding.cert.org/confluence/display/java/LCK09-J.+Do+not+perform+operations+that+can+block+while+holding+a+lock

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