क्या जावा में थ्रेड निर्माण श्रोता लिखना संभव है? उदाहरण के लिए एओपी का उपयोग कर ?!थ्रेड निर्माण श्रोता
मेरा मतलब कुछ ऐसा है कि यदि मेरा एप्लिकेशन धागा बनाता है तो मैं इस ऑब्जेक्ट को अपनी तालिका, कंटेनर या कुछ में पंजीकृत करना चाहता हूं।
क्या जावा में थ्रेड निर्माण श्रोता लिखना संभव है? उदाहरण के लिए एओपी का उपयोग कर ?!थ्रेड निर्माण श्रोता
मेरा मतलब कुछ ऐसा है कि यदि मेरा एप्लिकेशन धागा बनाता है तो मैं इस ऑब्जेक्ट को अपनी तालिका, कंटेनर या कुछ में पंजीकृत करना चाहता हूं।
मुझे लगता है कि इस AOP (उदाहरण के लिए AspectJ) के साथ संभव हो जाएगा। लेकिन अभी भी अपने Thread
और ThreadGroup
/Executor
प्रकारों को बनाने की आवश्यकता है, जब तक आप पहलू कंपाइलर के साथ जेडीके कक्षाओं को पुन: संकलित नहीं कर सकते। यदि आप थ्रेड ऑब्जेक्ट्स के निर्माण पर पंजीकरण करना चाहते हैं तो अपने थ्रेड के start
विधि पर पॉइंटकट को परिभाषित करें यदि आप थ्रेड लॉन्चिंग पर या createThread
पर अपने पूल के पंजीकरण पर पंजीकरण करना चाहते हैं।
निम्नलिखित काम करता है केवल यदि आप पहलू संकलक साथ JDK कंपाइल: सभी थ्रेड Thread.start
साथ शुरू किया था, ताकि विधि तो आप सलाह का उपयोग कर सकते हैं करना चाहते हैं कि क्या करना है के लिए एक pointcut लिख रहे हैं। बेशक यह बिल्कुल सही नहीं है एक कैश किया गया थ्रेडपूल निष्पादक प्रत्येक कार्य के लिए एक नया धागा शुरू नहीं कर सकता है, लेकिन हो सकता है कि यदि आप Runnable.run
और Callable.call
पर Thread.start
के बजाय पॉइंटकट पंजीकृत करते हैं, तो यह पर्याप्त हो सकता है।
यह थ्रेड चलाने के लिए काम कर सकता है, लेकिन प्रश्न थ्रेड पर चलने वाले धागे को सुनने के बारे में है। – user454322
@ user454322 नहीं। थ्रेड शुरू होने पर सलाह से पहले एक सलाह दी जाएगी। (यानी इनमें से किसी भी 3 विधियों को बुलाया जाता है) – zeller
मैं समझता हूं कि इसे धागे _are start_ से पहले बुलाया जाएगा, लेकिन जब थ्रेड _are बनाया_ कहा जाएगा? उदा।, क्या होगा यदि कोई थ्रेड _created_ है लेकिन _started_ कभी नहीं? – user454322
मैं एक थ्रेड बनाउंगा जो लगातार जेवीएम पर सभी चल रहे धागे सूचीबद्ध करता है।
फिर हर बार यह नोटिस करता है कि एक नया धागा दिखाई देता है, यह आपके कोड में किसी भी तरह से कक्षा में सूचित करेगा।
यहाँ कैसे सभी धागे वर्तमान में JVM पर चल सूची के बारे में कुछ लिंक कर रहे हैं:
========= ===
एक प्रारंभ कोड:
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 !
}
}
ये उदाहरण अच्छे और उपयोगी हैं, लेकिन कोई श्रोता नहीं है व्यवहार। मैं यह जानना चाहता हूं कि नया धागा जेवीएम द्वारा बनाया जाएगा चलो कुछ भी ओवरराइड किए बिना 'instatntly' कहें। –
@ ŁukaszRzeszotarski आप उपर्युक्त उदाहरणों से श्रोता व्यवहार को कार्यान्वित कर सकते हैं, हालांकि वे धागे नहीं बनाए गए धागे (जैसे आपने पूछा) चल रहे हैं। – user454322
शायद एक थ्रेड ग्रुप आपको चाहिए। सभी थ्रेड थ्रेड ग्रुप के सदस्य हैं और जब आप एक नया थ्रेड शुरू करते हैं तो इसे उसी समूह में डिफ़ॉल्ट रूप से उसके माता-पिता के रूप में जोड़ा जाता है।
सिद्धांत में समूह से थ्रेड जोड़ा या निकाला जाने पर अधिसूचित होने के लिए उप-वर्ग को संभव (लेकिन अनुशंसित नहीं) किया जाता है।
यह संभावना है कि इस समूह के धागे को मतदान करना, या सभी धागे को मतदान करना एक बेहतर समाधान है।
निर्माण पर धागे समूह में धागा जोड़ा जाता है या जब यह शुरू होता है? –
कोड से, यह तब शुरू होता है जब यह शुरू होता है। यदि आप जानना चाहते हैं कि थ्रेड कब बनाया गया है, तो आपको उप-वर्ग थ्रेड (और सभी थ्रेड बनाने कोड को बदलने की आवश्यकता है) –
यदि आप मुख्य धागे में 'क्लासलोडर' पंजीकृत करते हैं, तो उम्मीद है कि सभी नए धागे द्वारा विरासत में प्राप्त किया जाएगा, और फिर उम्मीद है कि किसी भी थ्रेड को कुछ कक्षा लोड करने की आवश्यकता होगी, जिसका अर्थ है कि आपके 'क्लासलोडर' से परामर्श लिया जाएगा और आपके पास धागे को पंजीकृत करने का अवसर .... – Saintali
मैं श्रोताओं के लिए आवश्यक विधियों के साथ 'थ्रेड' को विस्तारित करने के मार्ग से जाऊंगा। बेशक, केवल आपके कोड के लिए काम करेगा। – SJuan76
क्या आपको संक्रमण को ट्रैक करने की आवश्यकता है (जैसे: "अभी एक नया थ्रेड बनाया गया है और मुझे इसे एक बार में प्रतिक्रिया देना है") या यह आपके आवेदन में/द्वारा बनाए गए धागे की सूची या कुछ है समय में विशिष्ट बिंदु (जैसे: "अब मैं धागे जानना चाहता हूं और उनके साथ कुछ करना चाहता हूं।")? – Fildor