জাভাতে আলাদা থ্রেড সহ কোনও পদ্ধতিটি কীভাবে কল করবেন?


126

আসুন আমি একটি পদ্ধতি আছে doWork()। আমি কীভাবে এটি আলাদা থ্রেড (মূল থ্রেড নয়) থেকে কল করব।


সাম্প্রতিক এই সম্পর্কিত প্রশ্নের উপর কিছু উদাহরণ রয়েছে: জাভাতে একটি অসীম লুপ হত্যা
গ্রেগ হিউগিল

stackoverflow.com/questions/36832094/… আমার একটি অনুরূপ ইস্যু আছে এটি সমাধান করতে আমার সহায়তা করুন
শ্রুতি অ্যাজিজি

অ্যাসিঙ্ক্রোনাস কাজের জন্য আপনি রিএ্যাকটিভ জাভা ব্লগ.ড্যানলিউভ ২২/২০১/ / ১৫ / ১৫ / গ্রোকিং- আরক্সজাভা-পার্ট ১- এ একবার নজর দিতে পছন্দ করতে পারেন
নাথন ডান

উত্তর:


138

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প্যাকেজ।


1
যদি কোনও ভেরিয়েবল আপনি পাস করতে চান তবে কী হবে?
লুই রাইস

8
run()পদ্ধতি কোন প্যারামিটার নেয়, যাতে আপনি একটি পরিবর্তনশীল সেখানে পাস করতে পারবে না। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এটি কনস্ট্রাক্টারে পাস করুন - আমি এটি দেখানোর জন্য আমার উত্তরটি সম্পাদনা করব।
নোল এম

1
কোনও আলাদা থ্রেডে 1 পদ্ধতি কল করার জন্য কি একটি ছোট উপায় আছে? আমি উপায়টি জানি, এটি কি new Thread() { public void run() {myMethod();}}.start();সবচেয়ে কম?
স্টিভেন রুজ

@ নোয়েলএম আপনি নিজের এবং এমএএনএন এর উত্তরের মধ্যে পার্থক্য ব্যাখ্যা করতে পারবেন?
আসিফ মোশতাক

2
ম্যান এর উত্তর একটি বেনামত বাস্তবায়ন ব্যবহার করে Runnable- খনি একটি শ্রেণি যা প্রসারিত Runnable। এবং কারণ আমি এটি করেছি যে আমার নিজস্ব কনস্ট্রাক্টর রয়েছে যা তাত্ক্ষণিক বস্তুতে অবস্থিত হয়।
নোয়েল এম

182
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();
    }
});

আমি যা করছি তার জন্য এটি পুরোপুরি কাজ করেছিল। পর্যবেক্ষক নিদর্শন ব্যবহার করে একযোগে একটি ওয়েবসার্চ চালানো এবং একটি অগ্রগতি বার আপডেট করার প্রয়োজন।
ডিপিআই

@ আশিষ: দয়া করে ব্যাখ্যা করুন কোনটি এবং কেন সম্পাদিত হয়েছে?
এমএনএএন

1
@ আশিষ আগরওয়াল: লেখকের অনুমতি না নিয়ে কেউ যদি তা করে তখন আমার কাছে অদ্ভুত লাগে!
এমএনএএন

@ এমএনএএন আপনি কীভাবে থ্রেড প্যারামিটারে রান পদ্ধতি ব্যবহার করতে পারেন তা ব্যাখ্যা করতে পারেন? আরও ভাল পারফরম্যান্স?
আসিফ মোশতাক

1
আমাদের কি স্পষ্টভাবে থ্রেডটি বন্ধ করার দরকার আছে? সুস্পষ্টভাবে থ্রেডটি বন্ধ না করে কি মেমরি ফুটো তৈরির ঝুঁকি নেই? বা থ্রেডটি শেষ হয়ে গেলে এটি শেষ হয়ে যায় run()?
তারাভ

59

জাভা 8 এ আপনি কোডের একটি লাইন দিয়ে এটি করতে পারেন।

যদি আপনার পদ্ধতিটি কোনও পরামিতি না নেয়, আপনি একটি পদ্ধতি রেফারেন্স ব্যবহার করতে পারেন:

new Thread(MyClass::doWork).start();

অন্যথায়, আপনি একটি ল্যাম্বদা এক্সপ্রেশন পদ্ধতিতে কল করতে পারেন:

new Thread(() -> doWork(someParam)).start();

এটিকে ফিরিয়ে আনার জন্য দুঃখিত তবে এর ->অর্থ কী?
কাইল

1
এটি ল্যাম্বডা এক্সপ্রেশন তৈরি করতে ব্যবহৃত বাক্য গঠন। আরও তথ্যের জন্য এই লিঙ্কগুলি একবার দেখুন: জাভাতে '->' কী করবে? , এবং জাভা ™ টিউটোরিয়ালস - ল্যাম্বডা এক্সপ্রেশন
অ্যারন কোহান

@ অ্যারোন কোহনের দুর্দান্ত জিনিস! আপনি কি জাভাতে থ্রেডের কোনও বিকল্প জানেন? আমি পাইথন জগত থেকে এসেছি, যেখানে আমরা Celery task queue
অ্যাসিক্রোনাস স্টাফের

থ্রেডগুলি নিয়ে কাজ করার জন্য জাভাতে উচ্চ স্তরের বিমূর্ততা রয়েছে , তবে সম্ভবত আপনি আককার মতো আরও কিছু সন্ধান করছেন ?
অ্যারন কোহন

8

জিনিসগুলিতে কল করার জন্য আরও একটি দ্রুত বিকল্প (যেমন ডায়ালগবক্স এবং মেসেজবক্স এবং নন-থ্রেড নিরাপদ পদ্ধতির জন্য পৃথক থ্রেড তৈরি করা) লাম্বা এক্সপ্রেশন ব্যবহার করা হবে

  new Thread(() -> {
                      "code here"
            }).start();

3

কিছুদিন আগে, আমি একটি সাধারণ ইউটিলিটি ক্লাস লিখেছিলাম যা জেডিকে 5 এক্সিকিউটার পরিষেবা ব্যবহার করে এবং পটভূমিতে নির্দিষ্ট প্রক্রিয়াগুলি চালায়। যেহেতু ডো ওয়ার্ক () এর সাধারণত একটি শূন্য রিটার্ন মান থাকে, আপনি ব্যাকগ্রাউন্ডে এটি কার্যকর করতে এই ইউটিলিটি ক্লাসটি ব্যবহার করতে চাইতে পারেন।

এই নিবন্ধটি দেখুন যেখানে আমি এই ইউটিলিটিটি নথিভুক্ত করেছি।


6
ভবিষ্যত এবং কলযোগ্য আপনার জন্য এই জাতীয় কাজটি করে।
আমির আফগানি

হ্যাঁ তারা করে। এখানে ধারণাটি হ'ল একটি অ্যাসিনক্রোনাস মোড়কের পিছনে ইন্টারফেসটিকে বিমূর্ত করা।
রাজা কল্লুরু

লিঙ্কটি ভেঙে গেছে (404)।
পালাকসিন্ট

3

আরএক্সজাভা ২.x এর মাধ্যমে এটি অর্জন করতে আপনি ব্যবহার করতে পারেন:

Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();

subscribeOn()পন্থা উল্লেখ করে যা নির্ধারণকারী পদক্ষেপ চালানোর জন্য - RxJava সহ বিভিন্ন পূর্বনির্ধারিত নির্ধারণ হয়েছে Schedulers.io()যা করেছে একটি থ্রেড পুল ইনপুট / আউটপুট অপারেশন, এবং জন্য দেয়ার উদ্দেশ্যে করা Schedulers.computation()যা CPU- র নিবিড় অপারেশনের জন্য উদ্দীষ্ট।


3

আপনি যদি কমপক্ষে জাভা 8 ব্যবহার করেন তবে runAsyncক্লাস কমপ্লেটেবল ফিউচার থেকে পদ্ধতিটি ব্যবহার করতে পারেন

CompletableFuture.runAsync(() -> {...});

পরিবর্তে যদি আপনাকে কোনও ফলাফল ব্যবহার করতে supplyAsyncহয় তবে

CompletableFuture.supplyAsync(() -> 1);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.