2011-05-06 12 views
9

प्रतीक्षा करें/एक थ्रेड के भीतर उपयोग की जा सकती है? मेरा मतलब है कि मेरे पास श्रोता है और उस पल में जब उस श्रोता को बुलाया जाता है तो मैं अपने काम को करने के लिए धागा सक्षम करना चाहता हूं। मैं यह कैसे कर सकता हूं?सूचित करने के लिए कैसे उपयोग करें और

अद्यतन: मेरा डेटा डेटाबेस में लिखा गया है ... और प्रत्येक बार श्रोता को बुलाया जाता है.अब जो धागा मैंने बनाया है वह डेटा पढ़ता है और इसे कहीं भेजता है .... अगला ... मुझे कुछ अन्य डेटा मिलता है और वही काम करता है .... दूसरे धागे को यह जानने की ज़रूरत है कि वह आखिरी डेटा क्या पढ़ता था ताकि वह कहां से निकल सके ...

यहां एक नज़र डालें : using wait and notify within one thread यह कैसे मेरी समस्या like.Thx

लग रहा है मैं निम्नलिखित है:

synchronized (syncToken) 
{ 
    try { 
     syncToken.wait(); 

    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
System.out.println("MyThread: " + s); 
MyThread में

.... तो मैं इंतज़ार कर रहा पर मेरे धागा डाल जब मैं

MyThread t = new MyThread(syncToken); 
t.start(); 

करना ... हाँ?

और जब मैं यह कर:

syncToken.notify(); 

मैं अपने धागा ट्रैक पर वापस आने .... लेकिन अगली पंक्ति के निष्पादन के इंतजार के बाद से एक है()?

मेरा मतलब यह है: System.out.println("MyThread: " + s); ????

जब यू सूचित एक thred वह() प्रतीक्षा के बाद लाइन ??? Thx

+0

संभावित डुप्लिकेट [प्रतीक्षा करके और एक थ्रेड के भीतर सूचित करें] (http://stackoverflow.com/questions/5915449/using-wait-and-notify-within-one-thread) –

उत्तर

13

निम्नलिखित दो अलग धागे के बीच संगामिति का एक सरल उदाहरण है के साथ उसके क्रियान्वयन से जारी है करता है। उदाहरण में मुख्य धागा MyThread धागा शुरू करता है और प्रत्येक 3 सेकंड में यह डेटा को MyThread उदाहरण में सेट करता है और फिर MyThread इसे प्रिंट करता है।

Test.java:

package stack; 

public class Test { 
    public static void main (String args[]) 
    { 
     Object syncToken = new Object(); 
     MyThread t = new MyThread(syncToken); 
     t.start(); 
     for (int i = 0; i < 10; i++) 
     { 
      try { 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      synchronized(syncToken) 
      { 
       t.setText("Iteration " + i); 
       syncToken.notify(); 
      } 
     } 
    } 
} 

MyThread.java:

विचार एक तुल्यकालन वस्तु अन्य धागे को अपने आप उपयोग है कि वे उपयोग कर सकते हैं के अंत में इस पर है कि आप wait और notify है
package stack; 

public class MyThread extends Thread{ 

    String s; 
    Object syncToken; 
    public MyThread(Object syncToken) 
    { 
     this.s = ""; 
     this.syncToken = syncToken; 
    } 

    public void run() 
    { 
     while(true) // you will need to set some condition if you want to stop the thread in a certain time... 
     { 
      synchronized (syncToken) 
      { 
       try { 
        syncToken.wait(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
      System.out.println("MyThread: " + s); 
     } 
    } 

    public void setText(String s) 
    { 
     this.s = s; 
    } 
} 

इस उदाहरण में, मुख्य धागा एक स्ट्रिंग (प्रत्येक 3 सेकंड) सेट करता है और MyThread थ्रेड इसे प्रिंट करता है।

इसे अपनी आवश्यकताओं के अनुसार अनुकूलित करें, यह बहुत कठिन नहीं होना चाहिए।

+0

अकसर मैं करता हूं ... क्योंकि जब उस श्रोता को बुलाया जाता है तो मुझे कुछ डेटा प्राप्त होता है जिसे थ्रेड द्वारा संभाला जाना चाहिए। और डेटा कई चक्रों में प्राप्त होता है .... मेरा मतलब है कि मुझे अब कुछ डेटा मिल गया है और श्रोता को बुलाया जाता है ... मुझे भी कॉल करना चाहिए डेटा को प्रबंधित करने के लिए अन्य थ्रेड ... कुछ समय बाद मुझे अन्य डेटा मिलता है और मुझे वही करना पड़ता है .... क्या आप समझते हैं? – adrian

+0

लेकिन क्या यह एक ही धागे पर होना है? क्या डेटा का प्रत्येक भाग दूसरे पर निर्भर करता है? – MByD

+0

मैंने अपना प्रश्न संपादित कर लिया है ... कृपया – adrian

2

मुझे भी इसी तरह की समस्या थी। मैं दो धागे द्वारा इस्तेमाल किया एक मध्यस्थ बनाया (आपके मामले में यह श्रोताओं थ्रेड और अपने कार्य धागा हो सकता है): श्रोता:

arbiter.waitConsumer(); 
// prepare data 
arbiter.dataLoaded(); 

कार्य धागा:

while(true){ 
    arbiter.waitProducer(); 
    // consume data 
    arbiter.dataConsumed(); 
} 

मध्यस्थ:

public class Arbiter { 
private boolean dataLoaded = false; 
public synchronized void waitProducer(){ 
    while(!dataLoaded){ 
     try { 
      wait(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
public synchronized void waitConsumer(){ 
    while(dataLoaded){ 
     try { 
      wait(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
public synchronized void dataLoaded(){ 
    dataLoaded = true; 
    notify(); 
}public synchronized void dataConsumed(){ 
    dataLoaded = false; 
    notify(); 
}} 

श्रोता और कार्य आर्बिटर्स मॉनिटर के खिलाफ स्वयं को सिंक्रनाइज़ कर देगा।शायद आप अपनी आर्बिटर कतार या पाइप और स्टोर की तारीख में उपभोग करने के लिए कॉल कर सकते हैं?

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