কেন ইন্টারপ্রেড এক্সসেপশন ব্লকে থ্রেড।


155

Thread.currentThread.interrupt()ক্যাচ ব্লকে কেন পদ্ধতিটি প্রার্থনা করবেন ?

উত্তর:


160

এটি রাষ্ট্র বজায় রাখার জন্য করা হয় ।

যখন আপনি এটি ধরেন InterruptExceptionএবং এটি গিলেন, আপনি মূলত কোনও উচ্চ স্তরের পদ্ধতি / থ্রেড গোষ্ঠীগুলিকে বাধা লক্ষ্য করা থেকে বিরত রাখবেন। যা সমস্যার কারণ হতে পারে।

কল করে Thread.currentThread().interrupt()আপনি থ্রেডের অন্তরায় বাধিত পতাকাটি সেট করেছেন, সুতরাং উচ্চ স্তরের বাধা হ্যান্ডলারগুলি এটি লক্ষ্য করবে এবং এটি যথাযথভাবে পরিচালনা করতে পারে।

অনুশীলনে জাভা কনকুরনসি অধ্যায় .1.১.৩ এ আরও বিশদ আলোচনা করেছে : বাধার প্রতিক্রিয়া । এর বিধিটি হ'ল:

কেবলমাত্র কোড যা থ্রেডের বাধা নীতি প্রয়োগ করে তাতে বাধা দেওয়ার অনুরোধটি গ্রাস করতে পারে। সাধারণ উদ্দেশ্যে কাজ এবং গ্রন্থাগার কোড কখনও বাধা অনুরোধ গ্রাস করা উচিত নয়।


15
ইন ডকুমেন্টেশন বর্ণিত যে "নিয়ম অনুযায়ী কোনো পদ্ধতি যে একটি ছুঁড়ে প্রস্থানের InterruptedException মুছে ফেলে অবস্থা সাময়িক বিরতি যখন এটি তাই আছে। আমি মনে করি যে এই পরিপ্রেক্ষিতে উত্তর পরিষ্কার করে তোলে কেন আপনার বিরতি অবস্থা সংরক্ষণ করতে হবে।
Stelios Adamantidis

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

67

আমি মনে করি এই কোড নমুনা কিছুটা পরিষ্কার করে দেয়। ক্লাস যা কাজ করে:

   public class InterruptedSleepingThread extends Thread {

        @Override
        public void run() {
            doAPseudoHeavyWeightJob();
        }

        private void doAPseudoHeavyWeightJob() {
            for (int i=0;i<Integer.MAX_VALUE;i++) {
                //You are kidding me
                System.out.println(i + " " + i*2);
                //Let me sleep <evil grin>
                if(Thread.currentThread().isInterrupted()) {
                    System.out.println("Thread interrupted\n Exiting...");
                    break;
                }else {
                    sleepBabySleep();
                }
            }
        }

        /**
         *
         */
        protected void sleepBabySleep() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                //e.printStackTrace();
                Thread.currentThread().interrupt();
            }
        }
    }

প্রধান শ্রেণি:

   public class InterruptedSleepingThreadMain {

        /**
         * @param args
         * @throws InterruptedException
         */
        public static void main(String[] args) throws InterruptedException {
            InterruptedSleepingThread thread = new InterruptedSleepingThread();
            thread.start();
            //Giving 10 seconds to finish the job.
            Thread.sleep(10000);
            //Let me interrupt
            thread.interrupt();
        }

    }

স্থিতি পিছনে না রেখে বাধা কল করার চেষ্টা করুন।


13
তাহলে উপসংহারটি কি ??
স্কট 理论 理论

3
ধন্যবাদ। আপনি এখন যা বোঝাতে চাইছেন আমি তা দেখতে পেয়েছি: repl.it/@djangofan/ অন্তর্ভুক্ত ট্র্যাডডেক্সটামেল
জাজোফান

20

বিঃদ্রঃ:

http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

আমি কীভাবে এমন থ্রেডটি বন্ধ করব যা দীর্ঘ সময়ের জন্য অপেক্ষা করে (যেমন, ইনপুটটির জন্য)?

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

Thread.currentThread().interrupt();

এটি নিশ্চিত করে যে থ্রেডটি সক্ষম হওয়ার সাথে সাথে বাধাপ্রাপ্তি ধারণাকে পুনরায় আকার দেবে।


2

আমি এটিকে একটি খারাপ অভ্যাস বা কমপক্ষে কিছুটা ঝুঁকিপূর্ণ বিবেচনা করব। সাধারণত উচ্চ স্তরের পদ্ধতিগুলি ব্লকিং অপারেশনগুলি সম্পাদন করে না এবং তারা কখনই দেখতে পাবে নাInterruptedException সেখানে না। আপনি যদি বাধাদানযোগ্য অপারেশন করেন এমন প্রতিটি স্থানে এটি মাস্ক করেন তবে আপনি এটি কখনই পাবেন না।

Thread.currentThread.interrupt()অন্য কোনও ব্যতিক্রম বা অন্য কোনও উপায়ে বাধা অনুরোধের সংকেত না দেওয়ার একমাত্র যুক্তি (যেমন interruptedথ্রেডের মূল লুপে স্থানীয় ভেরিয়েবল ভেরিয়েবল নির্ধারণ করা ) এমন পরিস্থিতি যেখানে আপনি ব্যতিক্রমগুলি সহ সত্যিই কিছু করতে পারবেন না, যেমন finallyব্লকগুলির মধ্যে।

আপনি যদি Thread.currentThread.interrupt()কলটির প্রভাবগুলি আরও ভালভাবে বুঝতে চান তবে পিয়েটার তারকের উত্তর দেখুন ।


0

জাভা ডক থেকে রেফারেন্স করুন

এই থ্রেডটি যদি অপেক্ষা (), যোগদান (), ঘুম (দীর্ঘ) এর অনুরোধে অবরুদ্ধ থাকে তবে এর বাধাপূর্ণ স্থিতিটি সাফ হয়ে যাবে এবং এটি একটি বাধাপ্রাপ্তি গ্রহণ করবে।

যদি এই থ্রেডটি আই / ও অপারেশনে অবরুদ্ধ করা হয় তবে থ্রেডের বাধাপ্রাপ্ত স্থিতি সেট করা হবে এবং থ্রেডটি ক্লোসডবাইইন্টারটেইপ এক্সেপশন গ্রহণ করবে।

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

যদি পূর্বের শর্তগুলির কোনওটি না ধরে থাকে তবে এই থ্রেডের অন্তরায় স্থিতি সেট করা হবে।

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

ঠিক যেমন @ পেটার টার্ক বলেছেন => রাষ্ট্রটি রাখার জন্য এটি করা হয়। (এবং বিশেষত এমন পদ্ধতির জন্য যা বিঘ্নিত ধারণাটি ছুঁড়ে ফেলবে)

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