থ্রেড শুরু () এবং চলমানযোগ্য রান () এর মধ্যে পার্থক্য কী?


224

বলুন আমাদের দুটি চালানো আছে:

class R1 implements Runnable {
    public void run() {  }
    
}

class R2 implements Runnable {
    public void run() {  }
    
}

তাহলে এর মধ্যে পার্থক্য কী:

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();

    r1.run();
    r2.run();
}

এবং এই:

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();
    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2);

    t1.start();
    t2.start();
}

উত্তর:


309

প্রথম উদাহরণ: একাধিক থ্রেড নেই। উভয়ই একক (বিদ্যমান) থ্রেডে চালিত করে। কোনও থ্রেড তৈরি হয় না।

R1 r1 = new R1();
R2 r2 = new R2();

r1এবং r2ক্লাসের মাত্র দুটি পৃথক বস্তু যা Runnableইন্টারফেস প্রয়োগ করে এবং এই run()পদ্ধতিটি প্রয়োগ করে । আপনি যখন কল করবেন তখন r1.run()এটি বর্তমান থ্রেডে চালাচ্ছেন।

দ্বিতীয় উদাহরণ: দুটি পৃথক থ্রেড।

Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1এবং t2শ্রেণীর অবজেক্টস Thread। আপনি যখন কল করবেন তখন t1.start()এটি একটি নতুন থ্রেড শুরু করে এবং নতুন থ্রেডের মধ্যে এটি কার্যকর করার run()জন্য r1অভ্যন্তরীণ পদ্ধতিতে কল করে ।


5
কৌলড আমি বিবেচনা করব যে আমরা থ্রেডকে # স্টার্ট () বলার আগে, ওএস থ্রেডের সাথে আসলেই কিছু হয় না? এটি কেবল একটি জাভা বস্তু।
জেসকি

4
ডকুমেন্টেশন অনুযায়ী এটি সঠিক। থ্রেড অবজেক্টের সূচনা কোডটি পরীক্ষা করুন, যা ডকুমেন্টেশনের সাথে সঙ্গতিপূর্ণ। উত্স start()কোডেও এটি হ'ল, যা একটি ন্যাটভি পদ্ধতি কল করছে, যা অবশ্যই ওএস থ্রেড সম্পর্কিত বিষয়গুলি ঘটায়।
ভেশে গুরুং

3
থ্রেড কন্সট্রাকটর ডক্স হয় এখানে । থ্রেড অবজেক্টের সূচনা উত্স এখানেstart()পদ্ধতি উত্স এখানে
ভেশে গুরুং

92

যদি আপনি কেবল run()সরাসরি প্রার্থনা করেন তবে এটি কলিং থ্রেডে কার্যকর হয়, অন্য কোনও মেথড কলের মতো। Thread.start()প্রকৃতপক্ষে একটি নতুন থ্রেড তৈরি করা প্রয়োজন যাতে রানেরেবলের runপদ্ধতিটি সমান্তরালভাবে কার্যকর হয়।


2
হটস্পট জেভিএম-তে, জাভা থ্রেড এবং নেটিভ থ্রেডের মধ্যে সরাসরি ম্যাপিং রয়েছে। Thread.start()অনুরোধ থ্রেডের রাজ্যটিকে নতুন রাজ্য থেকে চলমানযোগ্য স্থিতিতে নিয়ে যায়। চলমান অর্থ এই নয় যে থ্রেড চলমান। একবার নেটিভ থ্রেড সূচিত করে নেটিভ থ্রেড ডাকে run()জাভা থ্রেড, যা থেকে থ্রেড রাষ্ট্র পরিবর্তন করে পদ্ধতি runnable করতে চলমান । থ্রেড সমাপ্ত হলে নেটিভ এবং জাভা উভয় থ্রেডের জন্য সমস্ত সংস্থান প্রকাশ করা হয়।
ওভাররেচেন্জ

@ সার্বজনীন পরিবর্তন রাষ্ট্রের পরিবর্তন সম্পর্কিত উপাদানগুলি আমি কোথায় পাব?
twlkyao

73

পার্থক্যটি হ'ল Thread.start()একটি থ্রেড শুরু করে যা run()পদ্ধতিটি কল করে , যখন Runnable.run()কেবল run()বর্তমান থ্রেডে পদ্ধতিটি কল করে ।


35

পার্থক্য যে, যখন প্রোগ্রাম কল start()পদ্ধতি, একটি নতুন থ্রেড তৈরি করা হয় এবং কোড ভিতরে run()মধ্যে কার্যকর নতুন থ্রেড যখন আপনি কল run()পদ্ধতি সরাসরি কোন নতুন থ্রেড তৈরি করা হবে এবং কোড ভিতরে run()বর্তমান থ্রেড সরাসরি চালানো হবে।

জাভা থ্রেডের মধ্যে এবং অন্য একটি পার্থক্য হ'ল আপনি দুবার কল করতে পারবেন না । একবার শুরু হয়ে গেলে, দ্বিতীয় কলটি জাভাতে ছুটে যাবে যখন আপনি বেশ কয়েকবার পদ্ধতিতে কল করতে পারেন কারণ এটি কেবল একটি সাধারণ পদ্ধতি।start()run()start()start()IllegalStateExceptionrun()


21

প্রকৃতপক্ষে Thread.start()একটি নতুন থ্রেড তৈরি করে এবং এর নিজস্ব প্রয়োগের দৃশ্য রয়েছে।

Thread.start()run()পদ্ধতিটিকে অবিচ্ছিন্নভাবে কল করে , যা নতুন থ্রেডের স্থিতিকে রান্নেবলে পরিবর্তন করে।

তবে Thread.run()কোনও নতুন থ্রেড তৈরি করে না। পরিবর্তে এটি বর্তমান চলমান থ্রেডে সিঙ্ক্রোনালিভাবে রান পদ্ধতি চালায়।

আপনি যদি ব্যবহার করছেন Thread.run()তবে আপনি একাধিক মাল্টি থ্রেডিংয়ের বৈশিষ্ট্যগুলি ব্যবহার করছেন না।


8

অনুরোধটি run()অন্য কোনও মেথড কলের মতো কলিং থ্রেডে চালিত হয়। যেখানে Thread.start()একটি নতুন থ্রেড তৈরি করে। আমন্ত্রণ run()একটি প্রোগ্রামেট বাগ।


7

আপনি যদি run()প্রধান পদ্ধতিটি করেন তবে মূল পদ্ধতির runথ্রেডটি আপনাকে চালিত হওয়া থ্রেডের পরিবর্তে পদ্ধতিটি আহ্বান করবে ।

start()পদ্ধতি নতুন থ্রেড তৈরি করে এবং যার জন্য run()পদ্ধতি কাজ করতে হবে


'মুখ্য পদ্ধতি' এর সাথে কিছু করার নেই।
লার্নের মারকুইস

3
@EJP, mainলেখকের দ্বারা বোঝানো কলিং পদ্ধতি। তার উত্তর বেশ ভাল। +1 ;-)
dom_beau

1
@ এমড_বাউ যদি তার অর্থ এটিই ছিল তবে তাঁর উচিত ছিল। তিনি যা বলেছেন তা ভুল ছিল। এই উত্তর সম্পর্কে 'যথেষ্ট ভাল' কিছুই নেই। এটি কেবল একটি বিভ্রান্তিকর গণ্ডগোল।
লার্নের মারকুইস

5

t.start() আপনি যখন নতুন থ্রেড চান তখন লাইব্রেরিটি আপনার কোডটি কল করার জন্য সরবরাহ করে।

r.run()পদ্ধতি যে আপনি প্রদান জন্য গ্রন্থাগার ডাকতে মধ্যে নতুন থ্রেড।


এই উত্তরগুলির বেশিরভাগই বড় চিত্রটিকে মিস করে, যা এটি জাভা ভাষার দিক থেকে, অন্য দুটি পদ্ধতির মধ্যে t.start()এবং এর r.run()চেয়ে বেশি কোনও পার্থক্য নেই ।

তারা উভয়ই কেবল পদ্ধতি। তারা উভয়ই সেই সুত্রে দৌড়ায় যা তাদের বলে । তারা উভয়ই যা করার জন্য কোড করা হয়েছিল তা করে এবং তারপরে তারা উভয়ই একই থ্রেডে ফিরে আসে তাদের কলকারীদের কাছে।

সবচেয়ে বড় পার্থক্য হল যে কোড অধিকাংশ হয় t.start()হয় নেটিভ কোড সময়, অধিকাংশ ক্ষেত্রে, কোড r.run()বিশুদ্ধ হতে জাভা যাচ্ছে। তবে এটি খুব একটা পার্থক্য নয়। কোড কোড। নেটিভ কোডটি পাওয়া শক্ত এবং আপনি এটি কখন খুঁজে পাবেন তা বোঝা শক্ত, তবে এটি এখনও কেবল কোড যা কম্পিউটারকে কী করতে হবে তা বলে।

তো, কী করে t.start()?

এটি একটি নতুন নেটিভ থ্রেড তৈরি করে, এটি সেই থ্রেডটিকে কল করার ব্যবস্থা করে t.run()এবং তারপরে এটি ওএসকে নতুন থ্রেডটি চালিত হতে দেয়। তারপরে এটি ফিরে আসে।

এবং কি করে r.run()?

মজার বিষয় হ'ল, যে ব্যক্তি এই প্রশ্নটি জিজ্ঞাসা করছেন তিনি হলেন তিনিই এটি লিখেছেনআপনিr.run() যা ( যা বিকাশকারী এটি লিখেছেন) যা কিছু করার জন্য এটি ডিজাইন করেছেন does


4

Thread.start()কোড সূচীকারীর সাথে থ্রেডকে নিবন্ধভুক্ত করে এবং শিডিয়ুলার run()পদ্ধতিটি কল করে । এছাড়াও, একটি ইন্টারফেস হয় Threadযখন বর্গ Runnable


3

পয়েন্টগুলি, যে সদস্যরা তৈরি করেছেন তা ঠিক আছে তাই আমি কিছু যুক্ত করতে চাই। জিনিসটি হ'ল জাভা কোনও মাল্টি-ওয়ারেনসেটকে সমর্থন করে না। তবে আপনি যদি অন্য ক্লাস এ থেকে ক্লাস বি অর্জন করতে চান তবে কী হয় তবে আপনি কেবল একটি শ্রেণি থেকে প্রাপ্ত হতে পারেন। সমস্যা এখন এটি কীভাবে উভয় শ্রেণি থেকে "আহরণ" করা যায়: এ এবং থ্রেড। অতএব আপনি রাননেবল ইন্টারফেস ব্যবহার করতে পারেন।

public class ThreadTest{
   public void method(){
      Thread myThread = new Thread(new B());
      myThread.start;
   }
}

public class B extends A implements Runnable{...

রান্নেবল - একটি ইন্টারফেস এবং থ্রেড - একটি শ্রেণি
পিংকি ওয়ালভে

1

যদি আপনি সরাসরি run()পদ্ধতিতে কল করেন তবে আপনি run()কলটার থ্রেডের অংশ হিসাবে পদ্ধতিটি কার্যকর হওয়ার কারণে আপনি বহু-থ্রেডিং বৈশিষ্ট্যটি ব্যবহার করছেন না ।

আপনি যদি start()থ্রেডে পদ্ধতিটি কল করেন, জাভা ভার্চুয়াল মেশিন রান () পদ্ধতিটি কল করবে এবং দুটি থ্রেড একই সাথে চলবে - কারেন্ট থ্রেড ( main()আপনার উদাহরণে) এবং অন্যান্য থ্রেড ( r1আপনার উদাহরণে চলমান )।

সোর্স কোড কটাক্ষপাত আছে start()পদ্ধতি থ্রেড বর্গ

 /**
     * Causes this thread to begin execution; the Java Virtual Machine
     * calls the <code>run</code> method of this thread.
     * <p>
     * The result is that two threads are running concurrently: the
     * current thread (which returns from the call to the
     * <code>start</code> method) and the other thread (which executes its
     * <code>run</code> method).
     * <p>
     * It is never legal to start a thread more than once.
     * In particular, a thread may not be restarted once it has completed
     * execution.
     *
     * @exception  IllegalThreadStateException  if the thread was already
     *               started.
     * @see        #run()
     * @see        #stop()
     */
    public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        group.add(this);
        start0();
        if (stopBeforeStart) {
            stop0(throwableFromStop);
        }
    }

    private native void start0();

উপরের কোডে, আপনি run()পদ্ধতিতে নিমন্ত্রণ দেখতে পাচ্ছেন না ।

private native void start0()কলিং run()পদ্ধতি জন্য দায়ী । জেভিএম এই দেশীয় পদ্ধতিটি কার্যকর করে।


0

প্রথম ক্ষেত্রে আপনি কেবল এবং জিনিসগুলির run()পদ্ধতিটি উপস্থাপন করছেন ।r1r2

দ্বিতীয় ক্ষেত্রে আপনি আসলে 2 টি নতুন থ্রেড তৈরি করছেন!

start()কোন সময় ডাকবে run()!


7
প্রকৃতপক্ষে, শুরু () রান () কে কল করবে না: এটি যদি হয় তবে রান () পদ্ধতিটি একই থ্রেড দ্বারা সম্পাদন হবে যা সূচনা () বলে। কী শুরু () করবে তা হ'ল একটি থ্রেড তৈরি করবে যা রান () পদ্ধতিটি কল করবে।
ব্রুনো রিস

0

রান পদ্ধতি: - এটি একটি বিমূর্ত পদ্ধতি যা মূলত রান্নেবল ইন্টারফেসে তৈরি হয় এবং থ্রেড শ্রেণিতে পাশাপাশি থ্রেড সাবক্লাসে (যেমন থ্রেড তার উত্স কোডে রান্নেবল প্রয়োগ করে) এবং রান্নেবল ইন্টারফেসের অন্য কোনও প্রয়োগকারী ক্লাস হয়। - এটি থ্রেডটি (রান্নেবল অবজেক্ট) লোড করতে ব্যবহৃত টাস্কটির সাথে করা হয় যাতে আপনি এটি টাস্কটি লেখার জন্য ওভাররাইড করে।

শুরুর পদ্ধতি: - থ্রেড ক্লাসে সংজ্ঞায়িত করা হয়। যখন সূচনা পদ্ধতিটি থ্রেড অবজেক্টে কল করা হয় 1- এটি অভ্যন্তরীণ নেটিভ (ননজাভা) পদ্ধতিটি কল করে স্টার্ট0 (); পদ্ধতি।

start0 (); পদ্ধতি: লো প্রসেসিংয়ের জন্য দায়ী (একটি থ্রেডের জন্য স্ট্যাক তৈরি এবং প্রসেসরের কাতারে থ্রেড বরাদ্দ করা) এই মুহুর্তে আমাদের প্রস্তুত / চালানোযোগ্য অবস্থায় একটি থ্রেড রয়েছে।

2- এমন সময়ে যখন থ্রেড শিডিয়ুলার সিদ্ধান্ত নিয়েছে যে কোনও থ্রেড প্রসেসরের কোরটিতে প্রবেশ করে (থ্রেড অগ্রাধিকার পাশাপাশি ওএস শিডিয়ুলিং অ্যালগরিদম) রান পদ্ধতিটি রান্নেবল অবজেক্টে ডাকা হয় (এটি বর্তমান রান্নেবল থ্রেড অবজেক্ট কিনা বা রান্নেবল অবজেক্ট পাস হয়েছে কিনা) থ্রেড কনস্ট্রাক্টরের কাছে) এখানে একটি থ্রেড একটি চলমান অবস্থায় প্রবেশ করে এবং তার কার্য সম্পাদন শুরু করে (রান পদ্ধতি)


-2

থ্রেড ক্লাসে পৃথক শুরু () এবং রান () পদ্ধতিগুলি থ্রেডযুক্ত প্রোগ্রামগুলি তৈরি করার দুটি উপায় সরবরাহ করে। শুরু () পদ্ধতিটি নতুন থ্রেডের সম্পাদন শুরু করে এবং রান () পদ্ধতিটি কল করে। শুরু () পদ্ধতিটি তত্ক্ষণাত্ ফিরে আসে এবং রান () পদ্ধতিটি ফিরে না আসা পর্যন্ত নতুন থ্রেডটি সাধারণত চলতে থাকে।

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

আপনার থ্রেডেড প্রোগ্রামের প্রকৃতির উপর নির্ভর করে থ্রেড রান () পদ্ধতিটি সরাসরি কল করা স্টার্ট () পদ্ধতির মাধ্যমে কল করার অনুরূপ আউটপুট দিতে পারে, তবে পরবর্তী ক্ষেত্রে কোডটি আসলে একটি নতুন থ্রেডে কার্যকর করা হয়।


2
'রান ()' কল করা থ্রেডেড প্রোগ্রামগুলি তৈরি করার উপায় নয়। শুধুমাত্র একটি উপায় আছে।
মারকুইস

-2

থ্রেড প্রসারিত বর্গ এবং চালনযোগ্য প্রয়োগ ইন্টারফেসের স্টার্ট () পদ্ধতি কল রান ওভাররাইড পদ্ধতি।

তবে রানকে কল করে এটি রান পদ্ধতির সন্ধান করে তবে শ্রেণি যদি রান্নেবল ইন্টারফেস প্রয়োগ করে তবে এটি রানকে () রানের ওভাররাইড পদ্ধতিতে কল করে।

প্রাক্তন .:

`

public class Main1
{
A a=new A();
B b=new B();
a.run();//This call run() of Thread because run() of Thread only call when class 
        //implements with Runnable not when class extends Thread.
b.run();//This not run anything because no run method found in class B but it 
        //didn't show any error.

a.start();//this call run() of Thread
b.start();//this call run() of Thread
}

class A implements Runnable{
@Override
    public void run() {
            System.out.println("A ");
    }
}

class B extends Thread {

    @Override
    public void run() {
            System.out.println("B ");
    }
}

`

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