সাধারণ ব্যাখ্যাটি বোঝার জন্য, জাভাতে রান্নেবল কী? [বন্ধ]


97

সাধারণ লোকের বিবেচনায় জাভাতে "রান্নেবল" কী? আমি উচ্চ বিদ্যালয়ের একজন এপি প্রোগ্রামিং শিক্ষার্থী, যার কাজটি গবেষণা করা বা অন্যের কাছ থেকে "চালানো" কী তা (আমরা কেবল ওওপিতে যাচ্ছি, এবং এখনও থ্রেড স্পর্শ করি নি) to


এপিআই ডক্সে কেবল একটি দরকারী লাইন রয়েছে: "পদ্ধতিটি চালানোর সাধারণ চুক্তিটি হ'ল এটি যে কোনও পদক্ষেপ নিতে পারে" "
টম হাটিন -

আরও অনেক আকর্ষণীয় গবেষণা কাজটি হ'ল: জাভাতে "স্টপেবল" কী, সাধারণ লোকের ভাষায়। আজকের প্রশিক্ষকরা তাই ...
উদো ক্লিমাচিউস্কি

9
@ উডো কালিমাশেউস্কি - লোকটি উচ্চ বিদ্যালয়ের শিক্ষার্থী, স্নাতক বা স্নাতকোত্তর শিক্ষার্থী নয়। এই প্রশিক্ষকের প্রত্যাশা শিক্ষার্থীদের ... আইএমও স্তরের সাথে সামঞ্জস্যপূর্ণ। যাইহোক, আমি সম্মত হই যে "প্রথম জিজ্ঞাসা করুন এসও" ওপির স্তরের কারও পক্ষে উপযুক্ত গবেষণা কৌশল নয়।
স্টিফেন সি

উত্তর:


192

একটি রান্নেবল হ'ল মূলত এক ধরণের শ্রেণি (রান্নেবল একটি ইন্টারফেস) যা থ্রেডে রাখা যেতে পারে, থ্রেডটি কী করার কথা বলে তা বর্ণনা করে।

Runnable ইন্টারফেস পদ্ধতি বাস্তবায়ন করতে ক্লাসের প্রয়োজন run()যেমন:

public class MyRunnableTask implements Runnable {
     public void run() {
         // do stuff here
     }
}

এবং তারপরে এটি ব্যবহার করুন:

Thread t = new Thread(new MyRunnableTask());
t.start();

আপনার যদি Runnableইন্টারফেস না থাকে , অন্য থ্রেডে আপনার স্টাফ চালানোর জন্য দায়বদ্ধ থ্রেড ক্লাসটি run()আপনার ক্লাসে কোনও পদ্ধতি সন্ধানের প্রতিশ্রুতি রাখে না , তাই আপনি ত্রুটি পেতে পারেন। এজন্য আপনাকে ইন্টারফেসটি প্রয়োগ করতে হবে।

উন্নত: নামবিহীন প্রকার

মনে রাখবেন যে আপনার যথারীতি কোনও শ্রেণি সংজ্ঞায়িত করার দরকার নেই, আপনি এই ইনলাইনটি সবই করতে পারেন:

Thread t = new Thread(new Runnable() {
    public void run() {
        // stuff here
    }
});
t.start();

এটি উপরের মতো, কেবলমাত্র আপনি অন্য নামী বর্গ তৈরি করবেন না।


68
এটি একটি দুর্দান্ত উত্তর যা পুরোপুরি দাবিটিকে অস্বীকার করে যে প্রশ্নটি "বর্তমান রূপে যুক্তিসঙ্গতভাবে উত্তর দেওয়া যায় না"।
রাসেল সিলভা

4
আমি জানি এটি অনেক দিন হয়ে গেছে তবে আমার একটি প্রশ্ন আছে। থ্রেডটি কেবল একবারে চালানো হয় বা যখন কোনও থ্রেড শুরু করি তখন কেবল প্রোগ্রামের অভ্যন্তরে বারবার চলতে থাকুন?
গামো

5
runপদ্ধতিটি শেষ না হওয়া পর্যন্ত থ্রেডটি চালানো হবে , তারপরে থ্রেডটি বন্ধ থাকবে। আপনি যদি কোনও থ্রেড বারবার চালাতে চান তবে runপদ্ধতির অভ্যন্তরে একটি লুপ রাখুন ।
opatut

4
বা কেবল জাভা 8 লাম্বদা ফাংশনটি ব্যবহার করে:new Thread(() -> System.out.println("hello from other thread")).start();
গ্যাবে

10

Runnable একটি ইন্টারফেস তাই হিসাবে সংজ্ঞায়িত:

interface Runnable {
    public void run();
}

এটি ব্যবহার করে এমন একটি বর্গ তৈরি করতে, কেবল শ্রেণিটি হিসাবে সংজ্ঞায়িত করুন (public) class MyRunnable implements Runnable {

এটি একটি নতুন থ্রেড না করেও ব্যবহার করা যেতে পারে। এটি মূলত আপনার একক পদ্ধতি, রান, যা কল করা যেতে পারে তার সাথে আপনার বেসিক ইন্টারফেস।

যদি আপনি প্যারামিটার হিসাবে রান্নেবল দিয়ে একটি নতুন থ্রেড তৈরি করেন তবে এটি রান থেরাপিটিকে একটি নতুন থ্রেডে কল করবে।

এটিও লক্ষ করা উচিত যে থ্রেডগুলি বাস্তবায়ন করে Runnableএবং যখন নতুন থ্রেড তৈরি করা হয় তখন (নতুন থ্রেডে) বলা হয়। ডিফল্ট বাস্তবায়ন কেবল আপনি কন্সট্রাক্টরের হাতে রান্নেবলকে যা বলে তা ডেকে তোলে, এজন্য আপনি new Thread(someRunnable)থ্রেডের runপদ্ধতিটিকে ওভাররাইড না করেই করতে পারেন ।


আপনি কি বলছেন থ্রেড উত্তরাধিকার সূত্রে প্রাপ্ত বা রান্নেবল বাস্তবায়নের মধ্যে কোনও পার্থক্য নেই? রান্নেবল ব্যবহার করার সময় থ্রেড কি র‍্যাপারের পাশাপাশি এক্সিকিউটারের মতো ব্যবহার হয়?
opatut

আমি বলছি [থ্রেড বাড়ানো এবং ওভাররাইডিং রান চালানো] এবং [একই রান পদ্ধতিতে রানডেবলের সাথে থ্রেডের একটি নতুন উদাহরণ তৈরি করা] এর মধ্যে কোনও পার্থক্য নেই
অ্যালেক্স কোলেম্যান

হ্যাঁ এটা পেয়েছি। কিন্তু আসলেই কোনও পার্থক্য নেই, না পারফরম্যান্স- না অন্যথায়?
opatut

4
@ অ্যালেক্সকোলম্যান - একটি বড় পার্থক্য রয়েছে। আপনি যদি Threadথ্রেড পুলিং প্রসারিত করেন এবং যদি আপনি থ্রেড পুলিং বাস্তবায়ন না করেন তবে আপনি সর্বদা নতুন থ্রেড তৈরির উল্লেখযোগ্য ব্যয় পরিধান করেন । বিপরীতে, কেবল বাস্তবায়ন করার Runnableঅর্থ আপনি সহজেই ThreadPoolExecutorServiceবা তৃতীয় পক্ষের থ্রেড পুলের মতো জিনিস ব্যবহার করতে পারেন ।
স্টিফেন সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.