2009-09-18 8 views
5

प्रेरणाक्या मैं समवर्ती धागे से XMPPConnection.sendPacket का आह्वान कर सकता हूं?

मैं अतिरिक्त आंखें चाहते पुष्टि करने के लिए कि मैं इस विधि XMPPConnection.sendPacket ( पैकेट) समवर्ती कॉल करने के लिए कर रहा हूँ। मेरे वर्तमान कोड के लिए, मैं एक धारावाहिक फैशन में कॉलबेल की सूची (अधिकतम 3) का आह्वान कर रहा हूं। प्रत्येक कॉल योग्य XMPPConnection के एक टुकड़े पर XMPP पैकेट भेजता/प्राप्त करता है। मैं एकाधिक कॉलको कताई करके इन कॉलबल्स को समानांतर करने की योजना बना रहा हूं प्रत्येक कॉल करने योग्य सिंक्रनाइज़ेशन के बिना साझा XMPPConnection पर sendPacket को आमंत्रित करेगा।

XMPPConnection

class XMPPConnection 
{ 
    private boolean connected = false; 

    public boolean isConnected() 
    { 
     return connected; 
    } 

    PacketWriter packetWriter; 

    public void sendPacket(Packet packet) 
    { 
     if (!isConnected()) 
      throw new IllegalStateException("Not connected to server."); 

     if (packet == null) 
      throw new NullPointerException("Packet is null."); 

     packetWriter.sendPacket(packet); 
    } 
} 

PacketWriter

class PacketWriter 
{ 
    public void sendPacket(Packet packet) 
    { 
     if (!done) { 
      // Invoke interceptors for the new packet 
      // that is about to be sent. Interceptors 
      // may modify the content of the packet. 
      processInterceptors(packet); 

      try { 
       queue.put(packet); 
      } 
      catch (InterruptedException ie) { 
       ie.printStackTrace(); 
       return; 
      } 
      synchronized (queue) { 
       queue.notifyAll(); 
      } 

      // Process packet writer listeners. Note that we're 
      // using the sending thread so it's expected that 
      // listeners are fast. 
      processListeners(packet); 
    } 

    protected PacketWriter(XMPPConnection connection) 
    { 
     this.queue = new ArrayBlockingQueue<Packet>(500, true); 
     this.connection = connection; 
     init(); 
    } 
} 

मैं क्या निष्कर्ष निकाल

के बाद से PacketWriter एक BlockingQueue उपयोग कर रहा है, वहाँ आह्वान करने के लिए मेरा इरादा के साथ कोई समस्या नहीं है से एकाधिक धागे से एनडी पैकेट। क्या मैं सही हूँ ?

उत्तर

0

आपने यहां पर्याप्त जानकारी प्रदान नहीं की है।

हम नहीं जानते कि कैसे निम्नलिखित कार्यान्वित कर रहे हैं:

  • processInterceptors
  • processListeners

कौन पढ़ता है/'पूर्ण' चर लिखता है? यदि एक धागा इसे सत्य पर सेट करता है, तो सभी अन्य धागे चुपचाप विफल हो जाएंगे।

एक त्वरित नज़र से, यह थ्रेड सुरक्षित नहीं दिखता है, लेकिन आपके द्वारा पोस्ट किए गए कार्यों से निश्चित रूप से बताने का कोई तरीका नहीं है।

अन्य मुद्दों:

  • क्यों PacketWriter XMPPConnectionwhen के एक वर्ग के सदस्य यह केवल एक विधि में प्रयोग किया जाता है है?
  • पैकेटवाइटर के पास XMPPConnection सदस्य var क्यों है और इसका उपयोग नहीं किया जाता है?
0

यदि आप जावा 5+ तक सीमित कर सकते हैं तो आप ब्लॉकिंगक्यूयू का उपयोग करने पर विचार कर सकते हैं।

जावा एपीआई डॉक्स से, एक मामूली परिवर्तन के साथ ArrayBlockingQueue उपयोग करने के लिए:

class Producer implements Runnable { 
    private final BlockingQueue queue; 
    Producer(BlockingQueue q) { queue = q; } 
    public void run() { 
    try { 
     while(true) { queue.put(produce()); } 
    } catch (InterruptedException ex) { ... handle ...} 
    } 
    Object produce() { ... } 
} 

class Consumer implements Runnable { 
    private final BlockingQueue queue; 
    Consumer(BlockingQueue q) { queue = q; } 
    public void run() { 
    try { 
     while(true) { consume(queue.take()); } 
    } catch (InterruptedException ex) { ... handle ...} 
    } 
    void consume(Object x) { ... } 
} 

class Setup { 
    void main() { 
    BlockingQueue q = new ArrayBlockingQueue(); 
    Producer p = new Producer(q); 
    Consumer c1 = new Consumer(q); 
    Consumer c2 = new Consumer(q); 
    new Thread(p).start(); 
    new Thread(c1).start(); 
    new Thread(c2).start(); 
    } 
} 

अपने उपयोग के लिए यदि आप अपने वास्तविक प्रेषक (वास्तविक कनेक्शन के धारक) होना उपभोक्ता, और पैकेट preparers होगा/प्रेषक निर्माता बनें।

एक दिलचस्प अतिरिक्त विचार यह है कि आप किसी अन्य प्रतीक्षा पैकेट से पहले भेजे गए एक्सएमपीपी पैकेट को ओवरराइड करने की अनुमति देने के लिए प्राथमिकताब्लॉकिंग क्यूयू का उपयोग कर सकते हैं।

इसके अलावा, डिजाइन पर ग्लेन के अंक अच्छे अंक हैं।आप अपना खुद का निर्माण करने के बजाय स्मैक एपीआई (http://www.igniterealtime.org/projects/smack/) पर एक नज़र डालना चाहते हैं।

2

हां आप बिना किसी समस्या के विभिन्न धागे से पैकेट भेज सकते हैं।

स्मैक अवरुद्ध कतार इसलिए है क्योंकि आप जो नहीं कर सकते हैं, अलग-अलग धागे एक ही समय में आउटपुट स्ट्रीम लिखने दें। स्मैक आउटपुट स्ट्रीम को प्रति पैकेट ग्रैन्युलरिटी के साथ लिखकर सिंक्रनाइज़ करने की ज़िम्मेदारी लेता है।

स्मैक द्वारा लागू पैटर्न बस एक ठेठ निर्माता/उपभोक्ता समरूपता पैटर्न है। आपके पास कई उत्पादक (आपके धागे) हो सकते हैं और केवल एक उपभोक्ता (स्मैक का पैकेटवाइटर अपने स्वयं के धागे में चल रहा है)।

सम्मान।

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