2010-12-23 6 views
5

नमस्ते मैं अपने प्रश्न के लिए माफी चाहता हूं, अगर यह मूर्खतापूर्ण लगता है।जावा में मुख्य कार्यक्रम की पृष्ठभूमि में ईवेंट श्रोता को कैसे कार्यान्वित करें?

मैं पृष्ठभूमि में चलने वाले धागे को लागू करना चाहता हूं और हर समय सुनता हूं। मेरा मतलब सुनकर, कहें कि यह मुख्य धागे से लौटाए गए मान पर जांच रखता है और यदि वाउ कुछ निश्चित आंकड़ों से अधिक है, तो यह कुछ विधि निष्पादित करता है, या प्रोग्राम से बाहर निकलता है।

यदि आप मुझे कुछ विचार दे सकते हैं या कम से कम मुझे कुछ उपयोगी संदर्भित कर सकते हैं, तो यह बहुत अच्छा होगा।

उत्तर

2

आप नहीं चाहते हैं कि यह थ्रेड एक लूप में चलाना चाहें, लगातार मूल्य को मतदान कर रहा है, क्योंकि यह प्रसंस्करण को बर्बाद कर देगा।

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

यदि कोड को संशोधित करने वाला कोड बदला नहीं जा सकता है, तो आप सबसे अच्छा कर सकते हैं अंतराल पर मूल्य की जांच करना। आपको तुरंत कोई परिवर्तन दिखाई नहीं देगा, और यह संभव है कि आप परिवर्तनों को पूरी तरह याद कर सकें क्योंकि अंतराल के दौरान मान कई बार बदल रहा है।

इनमें से कौन सा समाधान आपकी स्थिति को सर्वोत्तम बनाता है?

+0

आपके उत्तर के लिए धन्यवाद। मैं शुरुआत में एक लूप को लागू करने के बारे में सोच रहा था। असल में मैं विंडोज कमांड लाइन के माध्यम से बाहरी प्रक्रिया को निष्पादित कर रहा हूं, और बदले में मैं एक मूल्य पढ़ता हूं जिसे मुझे ट्रैक रखने की आवश्यकता होती है। मुझे स्ट्रिंग प्रारूप में प्रतिक्रिया मिलती है और चेक लागू करने के लिए इसे वापस int में डाल दिया जाता है। मैं इस बाहरी प्रक्रिया को एक लूप में Runtime.getRuntime()। Exec() के माध्यम से कॉल करने के लिए सोच रहा था और नियमित अंतराल पर मान को हर 2 सेकंड में कहता हूं। यह एमसीसी में संवेदनशील नहीं है। क्या आपको लगता है कि ऐसा करने के लिए यह एक बुद्धिमान विचार है? –

+0

@ सारा - आपकी योजना इसे संभालने के लिए उचित तरीके की तरह लगती है। मैं एक थ्रेड बनाने के लिए ['ScheduledExecutorService'] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html) को देखने की अनुशंसा करता हूं जो इस चेक को चलाएगा एक निश्चित अंतराल। – erickson

+0

[यह स्टैक ओवरफ्लो प्रश्न] (http://stackoverflow.com/questions/426758/running-a-java-thread-in-intervals) और स्वीकृत उत्तर 'ScheduledExecutorService' का उपयोग करने का एक अच्छा उदाहरण प्रदान करता है। – erickson

1

आप Java Tutorials में धागे का उपयोग करने पर कुछ जानकारी पा सकते हैं (यदि आप जावा में समेकन के लिए नए हैं तो मैं पहले इस ट्यूटोरियल को पढ़ने की सलाह देता हूं)। विशेष रूप से this section आपके लिए उपयोगी हो सकता है (यह दिखाता है कि नया धागा कैसे बनाएं और शुरू करें)।

+0

आपको बहुत बहुत धन्यवाद। वह वास्तव में सहायक था। –

0

मुझे लगता है कि आप बस एक JTextField की तरह मुख्य थ्रेड के लिए एक जीयूआई घटक का उपयोग कर सकते हैं, तो के बारे में घटना हैंडलिंग पढ़ सकते हैं और आप आसानी से पाठ क्षेत्र इनपुट मानों की स्थिति परिवर्तन को सुनने के लिए सक्षम हो जाएगा।

+0

मैं जीयूआई ऑब्जेक्ट्स को उस चीज़ पर प्रोसेसिंग बर्बाद करने के लिए तत्काल नहीं करना चाहता हूं जिसकी मुझे आवश्यकता नहीं है। मैं सरल समाधान की तलाश में हूं। –

+0

तब आप रॉडियन के जवाब को देख सकते हैं। – Ahmed

1

यदि आपको बस किसी अन्य थ्रेड से परिणाम के लिए मतदान करने की आवश्यकता है तो @Piotr द्वारा सुझाए गए अनुसार java.util.concurrent पैकेज का उपयोग करने का प्रयास करें।

import java.util.concurrent.*; 

class Main{ 
    public static void main(String[] args) throws Exception{ 
     //Create a service for executing tasks in a separate thread 
     ExecutorService ex = Executors.newSingleThreadExecutor(); 
     //Submit a task with Integer return value to the service 
     Future<Integer> otherThread = ex.submit(new Callable<Integer>(){ 
      public Integer call(){ 
       //do you main logic here 
       return 999;//return the desired result 
      } 
     } 

     //you can do other stuff here (the main thread) 
     //independently of the main logic (in a separate thread) 

     //This will poll for the result from the main 
     //logic and put it into "result" when it's available 
     Integer result = otherTread.get(); 

     //whatever you wanna do with your result 
    } 
} 

आशा इस मदद करता है: यह एक ठोस उदाहरण तुम ऐसा कैसे कर सकता है।

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