জাভার থ্রেড.স্লিপ কখন বাধাগ্রস্ত হয়?


110

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



1
নির্ভর করে কোন অর্থে আপনার অর্থ "উপেক্ষা করুন"। InterruptedExceptionধরা পড়ে যাওয়া ব্যতিক্রম, সুতরাং আপনি যে কোনও পদ্ধতিতে যোগদান করে বা ঘুমায় Thread, বা ফোন wait()করে তাতে এই ধরনের ব্যতিক্রম পরিচালনা বা ঘোষণা না করে আপনি সংকলন করতে পারবেন না Object
8bitjunkie

উত্তর:


41

আপনার ব্যতিক্রমটি সাধারণত উপেক্ষা করা উচিত নয়। নীচের কাগজটি একবার দেখুন:

বাধা গ্রাস করবেন না

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

public class TaskRunner implements Runnable {
    private BlockingQueue<Task> queue;

    public TaskRunner(BlockingQueue<Task> queue) { 
        this.queue = queue; 
    }

    public void run() { 
        try {
             while (true) {
                 Task task = queue.take(10, TimeUnit.SECONDS);
                 task.execute();
             }
         }
         catch (InterruptedException e) { 
             // Restore the interrupted status
             Thread.currentThread().interrupt();
         }
    }
}

পুরো কাগজটি এখানে দেখুন:

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-


38

যদি InterruptedExceptionকোনওটি নিক্ষিপ্ত হয় তবে এর অর্থ হ'ল কোনও কিছু সেই থ্রেডকে বাধা দিতে (সাধারণত সমাপ্ত করতে) চায়। এটি থ্রেড interrupt()পদ্ধতিতে একটি কল দ্বারা ট্রিগার করা হয় । অপেক্ষার পদ্ধতিটি এটি সনাক্ত করে এবং একটি ছুঁড়ে দেয় InterruptedExceptionযাতে ক্যাচ কোডটি অবিলম্বে সমাপ্তির জন্য অনুরোধটি পরিচালনা করতে পারে এবং নির্দিষ্ট সময় শেষ না হওয়া পর্যন্ত অপেক্ষা করতে হবে না।

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

} catch (InterruptedException e) {
  Thread.currentThread().interrupt();
  // code for stopping current task so thread stops
}

যা আবার সেই রাষ্ট্র নির্ধারণ করে। তারপরে, ফাঁসি কার্যকর করুন। এটি সঠিক আচরণ হবে, এমনকি শক্ত কখনও ব্যবহার করা হবে না।

এটি যুক্ত করা ভাল কি হতে পারে:

} catch (InterruptedException e) {
  throw new RuntimeException("Unexpected interrupt", e);
}

... ধরা ব্লকে বিবৃতি। মূলত এর অর্থ হ'ল এটি কখনই ঘটবে না। সুতরাং কোডটি যদি এমন পরিবেশে আবার ব্যবহার করা হয় যেখানে এটি ঘটে যেতে পারে তবে এটি তার সম্পর্কে অভিযোগ করবে।


5
জাভাতে দাবিগুলি ডিফল্টভাবে বন্ধ রয়েছে । সুতরাং এটি কেবল একটি নিক্ষেপ করা ভাল RuntimeException
এভেজেনি সার্জিভ

11

জাভা বিশেষজ্ঞের নিউজলেটারে (যা আমি সুরক্ষিতভাবে সুপারিশ করতে পারি) এর একটি আকর্ষণীয় নিবন্ধ ছিল এবং কীভাবে এটি পরিচালনা করতে হবে InterruptedException। এটি পড়া এবং হজম করার পক্ষে ভাল।


1
এটা কি বলে?
theonlygusti

5

ক্লাসের মতো sleep()এবং wait()ক্লাসের পদ্ধতিগুলি Threadএকটি নিক্ষেপ করতে পারে InterruptedException। এটি অপেক্ষায় বা ঘুমিয়ে threadথাকা অন্য কেউ বাধা দিতে চাইলে এটি ঘটবে thread


3

একক থ্রেড কোডে এটিকে হ্যান্ডেল করার একটি শক্ত এবং সহজ উপায় হ'ল এটি ধরা এবং এটি রানটাইম এক্সেকসেপ্টে পিছিয়ে নেওয়া, প্রতিটি পদ্ধতির জন্য এটি ঘোষণার প্রয়োজন এড়াতে।


-7

InterruptedExceptionসাধারণত নিক্ষিপ্ত একটি ঘুম বিঘ্নিত হয়।


13
এটি ভুল, যেহেতু এটি নিজেই ঘুম হয় না যা ইন্টারপুট হয়, তবে থ্রেড এটি চালিয়ে যায়। বাধা একটি থ্রেড রাষ্ট্র। এটি কেবল ঘুমের পদ্ধতিটি থেকে বেরিয়ে যাওয়ার দিকে পরিচালিত করে।
উবুন্টুড্রয়েড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.