আপনি java.lang.Thread.interrupt()
যখন ব্যাখ্যা করতে পারেন তখন কি হয়?
আপনি java.lang.Thread.interrupt()
যখন ব্যাখ্যা করতে পারেন তখন কি হয়?
উত্তর:
Thread.interrupt()
লক্ষ্য থ্রেডের বাধার স্থিতি / পতাকা সেট করে। তারপরে সেই টার্গেটের থ্রেডে চলমান কোডগুলি বাধার স্থিতিটি পোল করে এবং এটি যথাযথভাবে পরিচালনা করে। কিছু পদ্ধতি যা ব্লক করে যেমন Object.wait()
অবিলম্বে বাধাপ্রাপ্ত অবস্থা গ্রাস করে এবং উপযুক্ত ব্যতিক্রম ছুঁড়ে ফেলতে পারে (সাধারণত)InterruptedException
)
জাভাতে বাধা প্রাক-উদ্দীপনা নয়। বাধাটি সঠিকভাবে প্রক্রিয়া করার জন্য উভয় থ্রেডকে সহযোগিতা করতে হবে way লক্ষ্য থ্রেড যদি বাধা স্থিতিটি পোল না করে তবে বাধা কার্যকরভাবে উপেক্ষা করা হবে।
পোলিংয়ের মাধ্যমে ঘটে Thread.interrupted()
পদ্ধতির যা বর্তমান থ্রেডের বাধাপ্রাপ্ত স্থিতি ফিরিয়ে দেয় এবং সেই পতাকাটি বাধাগ্রস্থ করে দেয়। সাধারণত থ্রেড তখন থ্রো ইন্ড্রপটেড এক্সসেপশন এর মতো কিছু করতে পারে।
সম্পাদনা (থিলো মন্তব্য থেকে): কিছু এপিআই পদ্ধতি বিঘ্নিত হ্যান্ডলিংয়ে তৈরি করেছে। আমার মাথার শীর্ষের মধ্যে এটি অন্তর্ভুক্ত।
Object.wait()
, Thread.sleep()
এবংThread.join()
java.util.concurrent
স্ট্রাকচারInterruptedException
, পরিবর্তে ব্যবহার করে ClosedByInterruptException
।সম্পাদনা করুন ( @ থোমাস-পর্নিনের সম্পূর্ণতার জন্য ঠিক একই প্রশ্নের উত্তর থেকে )
থ্রেড বাধা হ'ল থ্রেডকে টান দেওয়ার মৃদু উপায়। এটি থ্রেডগুলিকে পরিষ্কারভাবে প্রস্থান করার সুযোগ দেওয়ার জন্য ব্যবহৃত হয় , এর বিপরীতে Thread.stop()
এটি একটি অ্যাসল্ট রাইফেল দিয়ে থ্রেড শ্যুটিংয়ের মতো।
বাধা কী?
একটি বাধা একটি থ্রেডের ইঙ্গিত যা এটি যা করছে তা বন্ধ করে দেওয়া উচিত এবং অন্য কিছু করা উচিত। কোনও থ্রেড কীভাবে বাধার ক্ষেত্রে প্রতিক্রিয়া জানায় তা ঠিক করার জন্য প্রোগ্রামারটির উপর নির্ভর করে তবে থ্রেডটি সমাপ্ত হওয়া খুব সাধারণ।
কীভাবে এটি বাস্তবায়ন করা হয়?
বাধা স্থিতি হিসাবে পরিচিত একটি অভ্যন্তরীণ পতাকা ব্যবহার করে বাধা ব্যবস্থার প্রয়োগ করা হয়। ইনভারকড থ্রেড.ইনটার্ট্র্যাপ এই পতাকাটি সেট করে। যখন থ্রেড থ্রেড.ট্রেটারে স্থিতিশীল পদ্ধতিতে অনুরোধ করে একটি বাধাগুলির জন্য পরীক্ষা করে, বাধা স্থিতি সাফ হয়ে যায়। স্ট্যাটাসহীন থ্রেড.আইস ইনটারপডড, যা অন্য থ্রেডের দ্বারা অন্যের বাধাপ্রাপ্ত স্থিতি অনুসন্ধানের জন্য ব্যবহৃত হয়, বাধা স্থিতির পতাকাটি পরিবর্তন করে না।
Thread.interrupt()
এপিআই থেকে উদ্ধৃতি :
এই থ্রেড বাধা দেয়। প্রথমে এই থ্রেডের চেকঅ্যাক্সেস পদ্ধতিটি আহ্বান করা হয়েছে, যার ফলে সিকিউরিটিএক্সসেপশন নিক্ষেপ হতে পারে।
যদি এই থ্রেডটি অবজেক্ট (), অপেক্ষা (দীর্ঘ) বা অবজেক্ট ক্লাসের পদ্ধতি (বা দীর্ঘ) অবধি (বা দীর্ঘ) অবধি অবরুদ্ধ করা হয় তবে যোগ দিন (দীর্ঘ), যোগ দিন (দীর্ঘ, অভ্যন্তরীণ) , ঘুম (দীর্ঘ), বা ঘুম (দীর্ঘ, অন্ত), এই শ্রেণীর পদ্ধতিগুলি, তারপরে এর বাধাপূর্ণ স্থিতিটি পরিষ্কার হয়ে যাবে এবং এটি একটি বাধাপ্রাপ্তি গ্রহণ করবে।
যদি এই থ্রেড কোনও বাধাজনক চ্যানেলের উপর আই / ও অপারেশনে অবরুদ্ধ থাকে তবে চ্যানেলটি বন্ধ হয়ে যাবে, থ্রেডের বাধাপ্রাপ্ত স্থিতি সেট করা হবে এবং থ্রেডটি ক্লোসডবাই ইন্টার্নট্রাপএক্সসেপশন গ্রহণ করবে।
যদি এই থ্রেডটি কোনও নির্বাচককে অবরুদ্ধ করা হয় তবে থ্রেডের বিঘ্নিত স্থিতি সেট করা হবে এবং এটি সিলেকশন অপারেশন থেকে তাত্ক্ষণিকভাবে ফিরে আসবে, সম্ভবত একটি শূন্য-না মান সহ, যেমন নির্বাচকের নির্বাচিত পদ্ধতিতে অনুরোধ করা হয়েছিল।
পূর্ববর্তী কোনও শর্ত যদি না ধরে থাকে তবে এই থ্রেডের অন্তরায় স্থিতি সেট করা হবে।
এটি সম্পর্কে সম্পূর্ণ বোঝার জন্য এটি পরীক্ষা করে দেখুন:
http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
যদি লক্ষ্যযুক্ত থ্রেডটি অপেক্ষায় থাকে (কল করে wait()
, বা অন্য কিছু সম্পর্কিত পদ্ধতিগুলি যা মূলত একই জিনিসটি করে, যেমন sleep()
), তবে এটি বাধাগ্রস্ত হবে, যার অর্থ এটি অপেক্ষা করছে যা অপেক্ষা করেছিল এবং পরিবর্তে একটি বিঘ্নিত এক্সসেপশন গ্রহণ করে।
wait()
এই পরিস্থিতিতে কী করা উচিত তা স্থির করে নিজেই থ্রেড (কোড বলে যে কোডটি ) to এটি স্বয়ংক্রিয়ভাবে থ্রেডটি শেষ করে না।
এটি কখনও কখনও সমাপ্তি পতাকার সাথে একত্রে ব্যবহৃত হয়। বাধা দেওয়া হলে, থ্রেড এই পতাকাটি পরীক্ষা করতে পারে এবং তারপরে নিজেই এটি বন্ধ করে দিতে পারে। তবে আবার, এটি কেবল একটি সম্মেলন।
সম্পূর্ণতার জন্য, অন্যান্য উত্তর ছাড়াও, থ্রেড বিঘ্নিত হলে এটা ব্লক সামনে Object.wait(..)
বা Thread.sleep(..)
ইত্যাদি এই এটা সমতূল্য যে পদ্ধতির উপর ব্লক পরে অবিলম্বে বিঘ্নিত হচ্ছে , নিম্নলিখিত উদাহরণে শো হিসাবে।
public class InterruptTest {
public static void main(String[] args) {
Thread.currentThread().interrupt();
printInterrupted(1);
Object o = new Object();
try {
synchronized (o) {
printInterrupted(2);
System.out.printf("A Time %d\n", System.currentTimeMillis());
o.wait(100);
System.out.printf("B Time %d\n", System.currentTimeMillis());
}
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("C Time %d\n", System.currentTimeMillis());
printInterrupted(3);
Thread.currentThread().interrupt();
printInterrupted(4);
try {
System.out.printf("D Time %d\n", System.currentTimeMillis());
Thread.sleep(100);
System.out.printf("E Time %d\n", System.currentTimeMillis());
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("F Time %d\n", System.currentTimeMillis());
printInterrupted(5);
try {
System.out.printf("G Time %d\n", System.currentTimeMillis());
Thread.sleep(100);
System.out.printf("H Time %d\n", System.currentTimeMillis());
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("I Time %d\n", System.currentTimeMillis());
}
static void printInterrupted(int n) {
System.out.printf("(%d) Am I interrupted? %s\n", n,
Thread.currentThread().isInterrupted() ? "Yes" : "No");
}
}
আউটপুট:
$ javac InterruptTest.java
$ java -classpath "." InterruptTest
(1) Am I interrupted? Yes
(2) Am I interrupted? Yes
A Time 1399207408543
WAS interrupted
C Time 1399207408543
(3) Am I interrupted? No
(4) Am I interrupted? Yes
D Time 1399207408544
WAS interrupted
F Time 1399207408544
(5) Am I interrupted? No
G Time 1399207408545
H Time 1399207408668
I Time 1399207408669
ফলস্বরূপ: আপনি যদি নীচের মতো লুপ করেন এবং নিয়ন্ত্রণটি ছেড়ে যায় Thread.sleep(..)
এবং লুপটির চারপাশে চলে যায় ঠিক মুহুর্তে বাধাপ্রাপ্ত হয় , ব্যতিক্রমটি এখনও ঘটতে চলেছে। সুতরাং থ্রেডটি বিঘ্নিত হওয়ার পরে নির্ভরযোগ্যভাবে নিক্ষেপ করা বাধাপ্রাপ্তি সম্পর্কে নির্ভর করা পুরোপুরি নিরাপদ :
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException ie) {
break;
}
}
Thread.interrupt()
লক্ষ্য থ্রেডের বাধিত স্থিতি / পতাকাটিকে সত্য হিসাবে নির্ধারণ করে যা যখন চেক করা হয় Thread.interrupted()
তখন অন্তহীন থ্রেড বন্ধ করতে সহায়তা করে । পড়ুন http://www.yegor256.com/2015/10/20/interrupted-exception.html
থ্রেড বাধা ফ্ল্যাগ বিঘ্নিত স্থিতির ভিত্তিতে । প্রতিটি থ্রেডের জন্য বাধা স্থিতির ডিফল্ট মানটি মিথ্যাতে সেট করা থাকে । যখনই থ্রেডে বাধা () পদ্ধতি কল করা হয় তখন বাধা স্থিতিটি সত্য হয়ে যায় ।
পাবলিক শূন্য বাধা ()
এই থ্রেড বাধা দেয়।
বর্তমান থ্রেডটি নিজেই বাধা সৃষ্টি না করে, যা সর্বদা অনুমোদিত, এই থ্রেডের চেকঅ্যাক্সেস পদ্ধতিটি আহ্বান করা হয়েছে, যার ফলে কোনও সিকিউরিটিএক্সসেপশন নিক্ষেপ হতে পারে।
যদি এই থ্রেডটি অবজেক্ট (), অপেক্ষা (দীর্ঘ) বা অবজেক্ট ক্লাসের পদ্ধতি (বা দীর্ঘ) অবধি (বা দীর্ঘ) অবধি অবরুদ্ধ করা হয় তবে যোগ দিন (দীর্ঘ), যোগ দিন (দীর্ঘ, অভ্যন্তরীণ) , ঘুম (দীর্ঘ), বা ঘুম (দীর্ঘ, অন্ত), এই শ্রেণীর পদ্ধতিগুলি, তারপরে এর বাধাপূর্ণ স্থিতিটি পরিষ্কার হয়ে যাবে এবং এটি একটি বাধাপ্রাপ্তি গ্রহণ করবে।
যদি এই থ্রেড কোনও বাধাজনক চ্যানেলের উপর আই / ও অপারেশনে অবরুদ্ধ থাকে তবে চ্যানেলটি বন্ধ হয়ে যাবে, থ্রেডের বাধাপ্রাপ্ত স্থিতি সেট করা হবে এবং থ্রেডটি ক্লোসডবাই ইন্টার্নট্রাপএক্সসেপশন গ্রহণ করবে।
যদি এই থ্রেডটি কোনও নির্বাচককে অবরুদ্ধ করা হয় তবে থ্রেডের বিঘ্নিত স্থিতি সেট করা হবে এবং এটি সিলেকশন অপারেশন থেকে তাত্ক্ষণিকভাবে ফিরে আসবে, সম্ভবত একটি শূন্য-না মান সহ, যেমন নির্বাচকের নির্বাচিত পদ্ধতিতে অনুরোধ করা হয়েছিল।
পূর্ববর্তী কোনও শর্ত যদি না ধরে থাকে তবে এই থ্রেডের অন্তরায় স্থিতি সেট করা হবে।
জীবিত নয় এমন থ্রেডে বাধা দেওয়ার কোনও প্রভাব নেই।
নিক্ষেপ: সিকিউরিটি এক্সসেপশন - যদি বর্তমান থ্রেড এই থ্রেডটি সংশোধন করতে না পারে
একটি বাধা একটি থ্রেডের ইঙ্গিত যা এটি যা করছে তা বন্ধ করে দেওয়া উচিত এবং অন্য কিছু করা উচিত। কোনও থ্রেড কীভাবে বাধা দেয়াকে ঠিক কীভাবে প্রতিক্রিয়া জানায় তা সিদ্ধান্ত নেওয়া প্রোগ্রামারটির উপর নির্ভর করে তবে থ্রেডটি সমাপ্ত হওয়া খুব সাধারণ। খুব ভাল রেফারেন্স: https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
থ্রেড.ইনটারপ্রেট () পদ্ধতিটি অভ্যন্তরীণ 'বিঘ্নিত স্থিতি' পতাকা সেট করে। সাধারণত এই পতাকাটি থ্রেড.ইনটারপ্রেড () পদ্ধতি দ্বারা পরীক্ষা করা হয়।
কনভেনশন দ্বারা, বিঘ্নিত এক্সসেপ্টের মাধ্যমে বিদ্যমান যে কোনও পদ্ধতিতে বাধা স্থিতির পতাকা সাফ করতে হবে।