2012-09-19 18 views
6

क्या जावा में थ्रेड निर्माण श्रोता लिखना संभव है? उदाहरण के लिए एओपी का उपयोग कर ?!थ्रेड निर्माण श्रोता

मेरा मतलब कुछ ऐसा है कि यदि मेरा एप्लिकेशन धागा बनाता है तो मैं इस ऑब्जेक्ट को अपनी तालिका, कंटेनर या कुछ में पंजीकृत करना चाहता हूं।

+1

यदि आप मुख्य धागे में 'क्लासलोडर' पंजीकृत करते हैं, तो उम्मीद है कि सभी नए धागे द्वारा विरासत में प्राप्त किया जाएगा, और फिर उम्मीद है कि किसी भी थ्रेड को कुछ कक्षा लोड करने की आवश्यकता होगी, जिसका अर्थ है कि आपके 'क्लासलोडर' से परामर्श लिया जाएगा और आपके पास धागे को पंजीकृत करने का अवसर .... – Saintali

+0

मैं श्रोताओं के लिए आवश्यक विधियों के साथ 'थ्रेड' को विस्तारित करने के मार्ग से जाऊंगा। बेशक, केवल आपके कोड के लिए काम करेगा। – SJuan76

+0

क्या आपको संक्रमण को ट्रैक करने की आवश्यकता है (जैसे: "अभी एक नया थ्रेड बनाया गया है और मुझे इसे एक बार में प्रतिक्रिया देना है") या यह आपके आवेदन में/द्वारा बनाए गए धागे की सूची या कुछ है समय में विशिष्ट बिंदु (जैसे: "अब मैं धागे जानना चाहता हूं और उनके साथ कुछ करना चाहता हूं।")? – Fildor

उत्तर

1

मुझे लगता है कि इस AOP (उदाहरण के लिए AspectJ) के साथ संभव हो जाएगा। लेकिन अभी भी अपने Thread और ThreadGroup/Executor प्रकारों को बनाने की आवश्यकता है, जब तक आप पहलू कंपाइलर के साथ जेडीके कक्षाओं को पुन: संकलित नहीं कर सकते। यदि आप थ्रेड ऑब्जेक्ट्स के निर्माण पर पंजीकरण करना चाहते हैं तो अपने थ्रेड के start विधि पर पॉइंटकट को परिभाषित करें यदि आप थ्रेड लॉन्चिंग पर या createThread पर अपने पूल के पंजीकरण पर पंजीकरण करना चाहते हैं।


निम्नलिखित काम करता है केवल यदि आप पहलू संकलक साथ JDK कंपाइल: सभी थ्रेड Thread.start साथ शुरू किया था, ताकि विधि तो आप सलाह का उपयोग कर सकते हैं करना चाहते हैं कि क्या करना है के लिए एक pointcut लिख रहे हैं। बेशक यह बिल्कुल सही नहीं है एक कैश किया गया थ्रेडपूल निष्पादक प्रत्येक कार्य के लिए एक नया धागा शुरू नहीं कर सकता है, लेकिन हो सकता है कि यदि आप Runnable.run और Callable.call पर Thread.start के बजाय पॉइंटकट पंजीकृत करते हैं, तो यह पर्याप्त हो सकता है।

+0

यह थ्रेड चलाने के लिए काम कर सकता है, लेकिन प्रश्न थ्रेड पर चलने वाले धागे को सुनने के बारे में है। – user454322

+0

@ user454322 नहीं। थ्रेड शुरू होने पर सलाह से पहले एक सलाह दी जाएगी। (यानी इनमें से किसी भी 3 विधियों को बुलाया जाता है) – zeller

+0

मैं समझता हूं कि इसे धागे _are start_ से पहले बुलाया जाएगा, लेकिन जब थ्रेड _are बनाया_ कहा जाएगा? उदा।, क्या होगा यदि कोई थ्रेड _created_ है लेकिन _started_ कभी नहीं? – user454322

4

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

यहाँ कैसे सभी धागे वर्तमान में JVM पर चल सूची के बारे में कुछ लिंक कर रहे हैं:

  1. Get a List of all Threads currently running in Java

  2. Listing All Running Threads

========= ===

एक प्रारंभ कोड:

ThreadCreationListener.java

public interface ThreadCreationListener { 
    public void onThreadCreation(Thread newThread); 
} 

ThreadCreationMonitor.java

public class ThreadCreationMonitor extends Thread { 
    private List<ThreadCreationListener> listeners; 
    private boolean canGo; 

    public ThreadCreationMonitor() { 
     listeners = new Vector<ThreadCreationListener>();//Vector class is used because many threads may use a ThreadCreationMonitor instance. 
     canGo = true; 
     // Initialize the rest of the class here... 
    } 

    // Most important methods 
    public void addListener(ThreadCreationListener tcl) { 
     listeners.add(tcl); 
    } 

    public void removeListener(ThreadCreationListener tcl) { 
     listeners.remove(tcl); 
    } 

    public void run() { 
     List<Thread> runningThreads; 
     List<Thread> lastRunningThreads; 

     while(canGo) { 
      // Step 1 - List all running threads (see previous links) 
      // runningThreads = ... 

      // Step 2 - Check for new threads and notify all listeners if necessary 
      if (runningThreads.removeAll(lastRunningThreads)==true) { 
       for(Thread t : runningThreads) { 
        for(ThreadCreationListener tcl : listeners) { 
         tcl.onThreadCreation(t);//Notify listener 
        } 
       } 
      } 
     } 
    } 

    public void shutdown() { 
     canGo = false; 
    } 

}

MyThreadInfoConsumer.java

public class MyThreadInfoConsumer implements ThreadCreationListener { 
    public void onThreadCreation(Thread newThread) { 
     // Process here the notification... 
    } 
} 

Main.java

public class Main { 
    public static void main(String[] args) { 
     ThreadCreationMonitor tcm = new ThreadCreationMonitor(); 
     tcm.start(); 

     MyThreadInfoConsumer myTIC = new MyThreadInfoConsumer(); 
     tcm.addListener(myTIC); 

     // rest of your code... 
     // Don't forget to call tcm.shutdown() when exiting your application ! 
    } 
} 
+0

ये उदाहरण अच्छे और उपयोगी हैं, लेकिन कोई श्रोता नहीं है व्यवहार। मैं यह जानना चाहता हूं कि नया धागा जेवीएम द्वारा बनाया जाएगा चलो कुछ भी ओवरराइड किए बिना 'instatntly' कहें। –

+0

@ ŁukaszRzeszotarski आप उपर्युक्त उदाहरणों से श्रोता व्यवहार को कार्यान्वित कर सकते हैं, हालांकि वे धागे नहीं बनाए गए धागे (जैसे आपने पूछा) चल रहे हैं। – user454322

1

शायद एक थ्रेड ग्रुप आपको चाहिए। सभी थ्रेड थ्रेड ग्रुप के सदस्य हैं और जब आप एक नया थ्रेड शुरू करते हैं तो इसे उसी समूह में डिफ़ॉल्ट रूप से उसके माता-पिता के रूप में जोड़ा जाता है।

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

यह संभावना है कि इस समूह के धागे को मतदान करना, या सभी धागे को मतदान करना एक बेहतर समाधान है।

+0

निर्माण पर धागे समूह में धागा जोड़ा जाता है या जब यह शुरू होता है? –

+0

कोड से, यह तब शुरू होता है जब यह शुरू होता है। यदि आप जानना चाहते हैं कि थ्रेड कब बनाया गया है, तो आपको उप-वर्ग थ्रेड (और सभी थ्रेड बनाने कोड को बदलने की आवश्यकता है) –

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