मान लीजिए कि मेरे पास एक तरीका है doWork()। मैं इसे एक अलग धागे (मुख्य धागा नहीं) से कैसे कह सकता हूं।
मान लीजिए कि मेरे पास एक तरीका है doWork()। मैं इसे एक अलग धागे (मुख्य धागा नहीं) से कैसे कह सकता हूं।
जवाबों:
एक वर्ग बनाएं जो Runnableइंटरफ़ेस को लागू करता है। जिस कोड को आप run()विधि में चलाना चाहते हैं, उसे डालें - यह वह विधि है जिसे आपको Runnableइंटरफ़ेस के अनुपालन के लिए लिखना होगा । अपने "मुख्य" धागे में, एक नया Threadवर्ग बनाएं , कंस्ट्रक्टर को आपकी एक आवृत्ति से गुजरते हुए Runnable, फिर उस start()पर कॉल करें । startJVM से कहता है कि नया धागा बनाने के लिए जादू करें, और फिर runउस नए धागे में अपनी विधि कहें ।
public class MyRunnable implements Runnable {
private int var;
public MyRunnable(int var) {
this.var = var;
}
public void run() {
// code in the other thread, can reference "var" variable
}
}
public class MainThreadClass {
public static void main(String args[]) {
MyRunnable myRunnable = new MyRunnable(10);
Thread t = new Thread(myRunnable)
t.start();
}
}
पर एक नजर डालें जावा के संगामिति ट्यूटोरियल आरंभ करने के लिए।
यदि आपकी विधि को अक्सर कहा जा रहा है, तो यह हर बार एक नया धागा बनाने के लायक नहीं हो सकता है, क्योंकि यह एक महंगा ऑपरेशन है। संभवतः किसी प्रकार के थ्रेड पूल का उपयोग करना सबसे अच्छा होगा। पर एक नज़र डालें Future, Callable, Executorमें कक्षाएं java.util.concurrentपैकेज।
run()विधि कोई पैरामीटर लगता है, इसलिए एक चर वहाँ से पारित नहीं कर सकते हैं। मेरा सुझाव है कि आप इसे कंस्ट्रक्टर में पास कर दें - मैं अपना उत्तर दिखाने के लिए संपादित करूँगा।
new Thread() { public void run() {myMethod();}}.start();तरीका पता है , क्या यह सबसे छोटा है?
Runnable- मेरा एक वर्ग है जो विस्तार करता है Runnable। और क्योंकि मैंने किया है कि मेरे पास अपना खुद का कंस्ट्रक्टर है जो राज्य को तात्कालिक वस्तु में बदल देता है।
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
});
t1.start();
या
new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
}).start();
या
new Thread(() -> {
// code goes here.
}).start();
या
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
या
Executors.newCachedThreadPool().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
run()?
Java 8 में आप कोड की एक लाइन के साथ ऐसा कर सकते हैं।
यदि आपकी विधि कोई पैरामीटर नहीं लेती है, तो आप विधि संदर्भ का उपयोग कर सकते हैं:
new Thread(MyClass::doWork).start();
अन्यथा, आप विधि को लंबोदर अभिव्यक्ति में कह सकते हैं:
new Thread(() -> doWork(someParam)).start();
->मतलब है?
Celery task queueअतुल्यकालिक सामान के लिए उपयोग करेंगे
चीजों को कॉल करने के लिए एक और तेज़ विकल्प (जैसे कि डायलॉगबॉक्स और मैसेजबॉक्स और बिना थ्रेड के सुरक्षित तरीकों के लिए अलग थ्रेड बनाना) लांबा एक्सप्रेशन का उपयोग करना होगा
new Thread(() -> {
"code here"
}).start();
कुछ समय पहले, मैंने एक साधारण उपयोगिता वर्ग लिखा था जो JDK5 निष्पादक सेवा का उपयोग करता है और पृष्ठभूमि में विशिष्ट प्रक्रियाओं को निष्पादित करता है। चूंकि doWork () में आमतौर पर एक शून्य रिटर्न मान होता है, आप पृष्ठभूमि में इसे निष्पादित करने के लिए इस उपयोगिता वर्ग का उपयोग करना चाह सकते हैं।
इस लेख को देखें जहाँ मैंने इस उपयोगिता को प्रलेखित किया था।
RxJava 2.x के साथ इसे प्राप्त करने के लिए आप इसका उपयोग कर सकते हैं:
Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();
यह subscribeOn()विधि निर्दिष्ट करती है कि किस शेड्यूलर पर कार्रवाई चलनी है - RxJava में कई पूर्वनिर्धारित अनुसूचक हैं, जिनमें Schedulers.io()I / O संचालन के लिए एक थ्रेड पूल है, और Schedulers.computation()जो CPU गहन संचालन के लिए अभिप्रेत है।
यदि आप कम से कम जावा 8 का उपयोग कर रहे हैं, तो आप runAsyncक्लास कंप्लीटेबल फ़ॉइल से विधि का उपयोग कर सकते हैं
CompletableFuture.runAsync(() -> {...});
यदि आपको supplyAsyncइसके बजाय परिणाम उपयोग वापस करने की आवश्यकता है
CompletableFuture.supplyAsync(() -> 1);