আমি না থাকলে কে জাভা থ্রেডকে বাধা () পদ্ধতি বলছে?


87

অনুশীলনে আমি জাভা কনকুরન્સી পড়েছি এবং পুনরায় পড়েছি, আমি এখানে বেশ কয়েকটি থ্রেড পড়েছি, আমি আইবিএম নিবন্ধটি বিঘ্নিত এক্সসেপশন এর সাথে ডিলিং পড়েছি এবং এখনও এমন কিছু আছে যা আমি বুঝতে পারি না যা আমি ভাঙ্গতে পারি বলে মনে করি দুটি প্রশ্নের মধ্যে নিচে:

  1. আমি যদি কখনও নিজেই অন্য থ্রেডগুলিতে বাধা না পাই তবে একটি বাধাপ্রাপ্তি কী ঘটতে পারে ?

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

উত্তর:


51

থ্রেড বিঘ্নিত প্রক্রিয়াটি যা করছে তা বন্ধ করার জন্য একটি অনুরোধের প্রতিক্রিয়া জানাতে (সহযোগিতা) থ্রেড পাওয়ার পছন্দের উপায়। যে কোনও থ্রেড (থ্রেড নিজেই আমি মনে করি) কল করতে পারেinterrupt() একটি থ্রেডে ।

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

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

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


1) আমি যদি কখনও নিজেই অন্য থ্রেডগুলিতে বাধা পাই না, তবে কোনও বাধাপ্রাপ্তি কী ঘটতে পারে?

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

2) যদি আমি কখনও কখনও নিজেই বাধা () ব্যবহার করে অন্য থ্রেডগুলিতে বাধা দিই না ... InterruptedExceptionতবে এর অর্থ কী? একজনকে ধরার পরে আমার কী করা উচিত? আমার অ্যাপ বন্ধ?

interrupt()কলগুলি কী করছে এবং কেন করছে তা নির্ধারণ করার জন্য আপনার কোডবেস বিশ্লেষণ করতে হবে । একবার আপনি এটি বের করে নিলে, আপনি << অ্যাপ্লিকেশনের << অংশে কী করতে হবে তা আপনি কাজ করতে পারেন।

যতক্ষণ না আপনি জানেন যে কেন InterruptedExceptionছুড়ে দেওয়া হচ্ছে, আমি এটিকে একটি কঠিন ত্রুটি হিসাবে বিবেচনা করার পরামর্শ দেব; উদাহরণস্বরূপ লগ ফাইলটিতে স্ট্যাকট্রেস প্রিন্ট করুন এবং অ্যাপটি বন্ধ করুন। (স্পষ্টতই, এটি সর্বদা সঠিক উত্তর নয় ... তবে মূল বিষয়টি হ'ল এটি "বাগ" এবং এটি বিকাশকারী / রক্ষণাবেক্ষণকারীদের নজরে আনতে হবে))

3) আমি কীভাবে জানতে পারি কে / কী কল করছে interrupt()?

এর উত্তম উত্তর নেই। আমি সবচেয়ে ভাল পরামর্শ দিতে পারি হ'ল একটি ব্রেকপয়েন্ট সেট Thread.interrupt()করা এবং কল স্ট্যাকের দিকে তাকাতে।


12

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

এটি সংক্ষেপে বলতে গেলে, আমি কেবল আপনার কোডটি এখন কোথায় চলছে তা বিবেচনা করব না , তবে ভবিষ্যতে কী প্রসঙ্গে চলতে পারে তা বিবেচনা করব। যেমন আপনি এটি একটি লাইব্রেরিতে রাখতে যাচ্ছেন? একটি পাত্র ? অন্য লোকেরা কীভাবে এটি ব্যবহার করবে? আপনি কি এটি পুনরায় ব্যবহার করতে যাচ্ছেন?


আমি ভেবেছিলাম কেবল শাটডাউন এখনই বাধা () পদ্ধতিতে কল করে। এটি কি শাটডাউনের জন্যও সত্য?
হরিন্দর

9

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

যাইহোক, আপনি InterruptedExceptionএকা "কমান্ড কমান্ড" হিসাবে আচরণ করবেন না । পরিবর্তে, থ্রেডগুলির চলমান স্থিতি নিয়ন্ত্রণের উপায় হিসাবে আপনার বাধা বিবেচনা করা উচিত, একইভাবে Object.notify()। কোনও কল থেকে ঘুম থেকে ওঠার পরে আপনি যেভাবে বর্তমান অবস্থাটি পরীক্ষা করে দেখতে চান Object.wait()(আপনি মনে করেন না যে জাগ্রত মানে আপনার অপেক্ষার শর্তটি সন্তুষ্ট হয়েছে), কোনও বাধা দেওয়ার সাথে ঝুঁকির পরে আপনাকে পরীক্ষা করতে হবে যে আপনাকে কেন বাধা দেওয়া হয়েছিল? । এটি করার একটি উপায় সাধারণত আছে। উদাহরণস্বরূপ, java.util.concurrent.FutureTaskএকটি isCancelled()পদ্ধতি আছে।

কোড নমুনা:

public void run() {
    ....
    try {
        .... // Calls that may block.
    } catch (InterruptedException e) {
        if (!running) {  // Add preferred synchronization here.
            return; // Explicit flag says we should stop running.
        }
        // We were interrupted, but the flag says we're still running.
        // It would be wrong to always exit here. The interrupt 'nudge'
        // could mean something completely different. For example, it
        // could be that the thread was blocking on a read from a particular
        // file, and now we should read from a different file.
        // Interrupt != quit (not necessarily).
    }
    ....
}
public void stop() {
    running = false; // Add preferred synchronization here.
    myThread.interrupt();
}

3

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

জেআরই থেকে আসা সম্ভাব্য অপ্রত্যাশিত বাধাগুলি java.util.concurrentঅ্যাপলেটগুলি বন্ধ করা এবং বন্ধ করা হয় tasks

থ্রেড বাধা হ্যান্ডলিং সাধারণত ভুলভাবে লেখা হয়। অতএব, আমি যেখানে সম্ভব সেখানে বাধা সৃষ্টি না করার জন্য স্থপতি সিদ্ধান্তের পরামর্শ দিচ্ছি। তবে কোড হ্যান্ডলিং বিঘ্ন সবসময় সঠিকভাবে লেখা উচিত। প্ল্যাটফর্মের বাইরে এখন বাধা নেওয়া যায় না।


হাই টম, আমি আপনার নামটি cljp থেকে মনে করি;) ঠিক আছে, স্পষ্টত: আমাকে কখনও বাধা () নিজেকে ছুঁড়ে মারতে হবে না ... যদি না আমি একটি বাধাপ্রাপ্তি গ্রহণ করি এবং বাধা স্থিতিকে পুনরায় দৃ to়ভাবে বলার প্রয়োজন না হয় তবে এটি এখনও 100% নয় is আমার কাছে পরিষ্কার। আমি এখানে নতুন এবং আপভোট এবং উত্তর / মন্তব্যগুলির সংখ্যা (সঠিক এবং ভুলগুলি উভয়ই) দ্বারা বিস্মিত: স্পষ্টতই এটি এমন একটি বিষয় যা তুচ্ছ বা কমপক্ষে, সাধারণত ভালভাবে ব্যাখ্যা করা হয় না। এটি বলেছে যে সমস্ত পোস্টের জন্য আমি কী চলছে তার একটি পরিষ্কার চিত্র পেতে শুরু করেছি :)
সিনট্যাক্স T3rr0r

3

আপনি নিজের থ্রেড ক্লাস (প্রসারিত java.lang.Thread) এবং ওভাররাইড interrupt()পদ্ধতি তৈরি করে এটি শিখতে পারেন , যাতে আপনি স্ট্রোক্রেসটি একটি স্ট্রিং ফিল্ডে রেকর্ড করে, এবং তারপরে সুপার ইন্ট্রিটারপ্রেট () এ স্থানান্তর করে।

public class MyThread extends Thread {

    public volatile String interruptStacktrace; // Temporary field for debugging purpose.

    @Override
    public void interrupt() {
        interruptStacktrace = dumpStack(); // You implement it somehow...

        super.interrupt();
    }
}

1

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


1

আমি মনে করি আপনি কেন বাধা সম্পর্কে কিছুটা বিভ্রান্ত হয়ে পড়েছেন তা আমি বুঝতে পেরেছি। আমার উত্তরগুলি লাইনে বিবেচনা করুন:

আমি যদি কখনও নিজেই অন্য থ্রেডগুলিতে বাধা না পাই তবে একটি বাধাপ্রাপ্তি কী ঘটতে পারে ?

প্রথমত আপনি অন্যান্য থ্রেড বাধা দিতে পারেন; আমি জানি যে জেসিআইপিতে এটি উল্লেখ করা হয়েছে যে আপনার নিজের থ্রেডগুলি কখনও থামানো উচিত নয়; তবে এই বিবৃতিটি সঠিকভাবে বুঝতে হবে। এর অর্থ হ'ল আপনার কোড যা কোনও স্বেচ্ছাসেবী থ্রেডে চলতে পারে তাতে বাধা দেওয়া উচিত নয় কারণ এটি থ্রেডের মালিক না হওয়ায় এটির কোনও বাধা নীতির কোনও সূত্র নেই। সুতরাং আপনি অন্যান্য থ্রেডে বাধা দেওয়ার জন্য অনুরোধ করতে পারেন, তবে এর মালিককে বাধা দেওয়ার পদক্ষেপ নিতে দিন; এটির সাথে আপনার বাধা নীতিটি অন্তর্ভুক্ত রয়েছে, এটি আপনার কার্য কোড নয়; অন্তত বাধা পতাকা সেট করতে সৌম্য হতে হবে!

এখনও বাধা থাকতে পারে এমন অনেকগুলি উপায় রয়েছে, টাইমআউট হতে পারে, জেভিএম বিঘ্নিত হতে পারে ইত্যাদি

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

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

আশা করি এটি সাহায্য করেছে।


0

InterruptedExceptionবলছেন যে একটি রুটিন পারে বিঘ্নিত, কিন্তু অগত্যা এটা হতে করবে।

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

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