আসুন আমি একটি পদ্ধতি আছে doWork()
। আমি কীভাবে এটি আলাদা থ্রেড (মূল থ্রেড নয়) থেকে কল করব।
আসুন আমি একটি পদ্ধতি আছে doWork()
। আমি কীভাবে এটি আলাদা থ্রেড (মূল থ্রেড নয়) থেকে কল করব।
উত্তর:
Runnable
ইন্টারফেস প্রয়োগ করে এমন একটি শ্রেণী তৈরি করুন । run()
পদ্ধতিটিতে আপনি যে কোডটি চালাতে চান তা রাখুন - এই পদ্ধতিটি আপনাকে Runnable
ইন্টারফেসের সাথে মেনে চলতে হবে । আপনার "মূল" থ্রেডে, একটি নতুন Thread
ক্লাস তৈরি করুন , কনস্ট্রাক্টরকে আপনার একটি উদাহরণ দিয়ে যাবেন Runnable
, তারপরে start()
এটি কল করুন। start
জেভিএমকে নতুন থ্রেড তৈরির জন্য যাদু করার জন্য বলে এবং তারপরে 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()
?
জাভা 8 এ আপনি কোডের একটি লাইন দিয়ে এটি করতে পারেন।
যদি আপনার পদ্ধতিটি কোনও পরামিতি না নেয়, আপনি একটি পদ্ধতি রেফারেন্স ব্যবহার করতে পারেন:
new Thread(MyClass::doWork).start();
অন্যথায়, আপনি একটি ল্যাম্বদা এক্সপ্রেশন পদ্ধতিতে কল করতে পারেন:
new Thread(() -> doWork(someParam)).start();
->
অর্থ কী?
Celery task queue
জিনিসগুলিতে কল করার জন্য আরও একটি দ্রুত বিকল্প (যেমন ডায়ালগবক্স এবং মেসেজবক্স এবং নন-থ্রেড নিরাপদ পদ্ধতির জন্য পৃথক থ্রেড তৈরি করা) লাম্বা এক্সপ্রেশন ব্যবহার করা হবে
new Thread(() -> {
"code here"
}).start();
কিছুদিন আগে, আমি একটি সাধারণ ইউটিলিটি ক্লাস লিখেছিলাম যা জেডিকে 5 এক্সিকিউটার পরিষেবা ব্যবহার করে এবং পটভূমিতে নির্দিষ্ট প্রক্রিয়াগুলি চালায়। যেহেতু ডো ওয়ার্ক () এর সাধারণত একটি শূন্য রিটার্ন মান থাকে, আপনি ব্যাকগ্রাউন্ডে এটি কার্যকর করতে এই ইউটিলিটি ক্লাসটি ব্যবহার করতে চাইতে পারেন।
এই নিবন্ধটি দেখুন যেখানে আমি এই ইউটিলিটিটি নথিভুক্ত করেছি।
আরএক্সজাভা ২.x এর মাধ্যমে এটি অর্জন করতে আপনি ব্যবহার করতে পারেন:
Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();
subscribeOn()
পন্থা উল্লেখ করে যা নির্ধারণকারী পদক্ষেপ চালানোর জন্য - RxJava সহ বিভিন্ন পূর্বনির্ধারিত নির্ধারণ হয়েছে Schedulers.io()
যা করেছে একটি থ্রেড পুল ইনপুট / আউটপুট অপারেশন, এবং জন্য দেয়ার উদ্দেশ্যে করা Schedulers.computation()
যা CPU- র নিবিড় অপারেশনের জন্য উদ্দীষ্ট।
আপনি যদি কমপক্ষে জাভা 8 ব্যবহার করেন তবে runAsync
ক্লাস কমপ্লেটেবল ফিউচার থেকে পদ্ধতিটি ব্যবহার করতে পারেন
CompletableFuture.runAsync(() -> {...});
পরিবর্তে যদি আপনাকে কোনও ফলাফল ব্যবহার করতে supplyAsync
হয় তবে
CompletableFuture.supplyAsync(() -> 1);