2011-10-10 11 views
12

मैं isFinish() का उपयोग कर दिए गए मान सच है करने के लिए कैसे निर्दिष्ट करूं CallMe() साथ Status?मैं जावा में आंतरिक थ्रेड रननेबल विधि से वापस मूल्य कैसे प्राप्त करूं?

public static boolean isFinish() 
{  
    boolean Status = false; 
    new Thread(new Runnable() 
    { 
    public void run() 
    { 
     /* This shell return true or false 
     * How do you keep it in Status 
     */ 
     CallMe(); 
    } 
    }).start(); 

    /* How can i get the true or false exactly from CallMe? here */ 
    return Status; 
} 

public static boolean CallMe() 
{ 
    /* some heavy loads ... */ 
    return true; 
} 
+3

थ्रेड का उपयोग क्यों करें? प्रारंभ() निष्पादन का एक अलग धागा बनाएगा और उस बिंदु पर फिनिश इसके निष्पादन को जारी रखेगी। –

उत्तर

27

ऐसा करने के दो तरीके हैं। पहला भविष्य गणना गणना परिणाम का उपयोग करना है और दूसरा साझा चर होना है। मुझे लगता है कि पहली विधि दूसरे की तुलना में अधिक क्लीनर है, लेकिन कभी-कभी आपको धागे को मूल्यों को भी धक्का देना पड़ता है।

  • RunnableFuture का उपयोग करना।

FutureTaskRunnableFuture लागू करता है। तो आप उस कार्य को बनाते हैं, जिसे एक बार निष्पादित किया गया है, उसके पास मूल्य होगा।

RunnableFuture f = new FutureTask(new Callable<Boolean>() { 
    // implement call 
}); 
// start the thread to execute it (you may also use an Executor) 
new Thread(f).start(); 
// get the result 
f.get(); 
  • एक धारक वर्ग

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

// create the shared variable 
final AtomicBoolean b = new AtomicBoolean(); 
// create your thread 
Thread t = new Thread(new Runnable() { 
    public void run() { 
    // you can use b in here 
    } 
}); 
t.start(); 
// wait for the thread 
t.join(); 
b.get(); 
+0

+1, अच्छा जवाब –

+0

+1, दो विधियों की तरह, वास्तव में धन्यवाद। मुझे पूर्ण-डुप्लेक्स होना चाहिए, दोनों मुझे सबसे अच्छी दिशा देता है। – YumYumYum

+0

धन्यवाद! मुझे अपनी विश्वविद्यालय परियोजना के लिए इसकी ज़रूरत थी, आपने बहुत मदद की। –

3

आप Callable<Boolean> उपयोग करने के लिए कोड को फिर से लिखने और प्राप्त एक Future जब Runnable की शुरूआत।

वायदा शुभारंभ धागा ठीक से जांच कर लें कि मूल्य के लिए तैयार है और इसे एसिंक्रोनस रूप से पढ़ने के लिए अनुमति देते हैं। आप हाथ से कोडिंग कर सकते हैं, लेकिन Future अब मानक जेवीएम पुस्तकालयों का हिस्सा है, आप (प्रोग्रामिंग क्लास के बाहर) क्यों होंगे?

1

कच्चे धागे के साथ कार्य करना, आप एक नामित प्रकार के साथ Runnable लागू है, और उस में मान संग्रहीत कर सकता है।

class MyRunnable implements Runnable { 
    boolean status; 

    public void run() { 
     ... 
    } 
} 

हालांकि, यदि आप किसी अन्य धागे के साथ काम कर रहे हैं, तो आपको किसी भी तरह से सिंक्रनाइज़ करना होगा।

यह java.util.concurrent पदानुक्रम द्वारा प्रदान की उच्च स्तर के उपकरणों का उपयोग करने के लिए आसान हो जाएगा। आप एक निष्पादक को एक कॉल करने योग्य जमा कर सकते हैं, और भविष्य प्राप्त कर सकते हैं। यदि भविष्य हो तो आप भविष्य से पूछ सकते हैं, और परिणाम प्राप्त कर सकते हैं। Oracle tutorial here है।

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