আমি প্রত্যাশা করব যে JVM কমপক্ষে সংকেতগুলির জন্য এবং প্রয়োগ দ্বারা তৈরি সমস্ত চলমান থ্রেডকে ( ) কৃপায়ভাবে বাধাthread.interrupt()
দেয় ।SIGINT (kill -2)
SIGTERM (kill -15)
এইভাবে, সিগন্যালটি তাদের কাছে ফরোয়ার্ড করা হবে, মানক উপায়ে একটি সুদৃশ্য থ্রেড বাতিলকরণ এবং উত্স চূড়ান্তকরণের অনুমতি দেয় ।
কিন্তু এই ক্ষেত্রে না হয় অন্তত (আমার জেভিএম বাস্তবায়নের: Java(TM) SE Runtime Environment (build 1.8.0_25-b17), Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
।
অন্যান্য ব্যবহারকারীরা যেমন মন্তব্য করেছেন, শাটডাউন হুকের ব্যবহার বাধ্যতামূলক বলে মনে হচ্ছে।
তো, আমি কীভাবে এটি পরিচালনা করব?
ভাল প্রথমে, আমি সমস্ত প্রোগ্রামগুলিতে এটি সম্পর্কে চিন্তা করি না, কেবলমাত্র যেখানে আমি ব্যবহারকারী বাতিলকরণ এবং অপ্রত্যাশিত প্রান্তের ট্র্যাক রাখতে চাই in উদাহরণস্বরূপ, কল্পনা করুন যে আপনার জাভা প্রোগ্রামটি অন্যের দ্বারা পরিচালিত একটি প্রক্রিয়া। আপনি এটি পারফরম্যান্সভাবে বন্ধ করে দেওয়া হয়েছে ( SIGTERM
ম্যানেজার প্রক্রিয়া থেকে) বা কোনও শাটডাউন হয়েছে কিনা তা আলাদা করতে চাইতে পারেন (শুরুতে কাজটি স্বয়ংক্রিয়ভাবে পুনরায় চালু করার জন্য)।
একটি ভিত্তি হিসাবে, আমি সর্বদা আমার দীর্ঘমেয়াদী থ্রেডগুলিকে নিয়মিত বাধাপ্রাপ্ত অবস্থান সম্পর্কে সচেতন করি এবং InterruptedException
যদি সেগুলি বাধা দেয় তবে একটি নিক্ষেপ করি । এটি বিকাশকারী দ্বারা নিয়ন্ত্রিত পদ্ধতিতে কার্যকরকরণের চূড়ান্তকরণ সক্ষম করে (স্ট্যান্ডার্ড ব্লকিং অপারেশনগুলির মতো একই ফলাফলও তৈরি করে)। তারপরে, থ্রেড স্ট্যাকের শীর্ষ স্তরে InterruptedException
ক্যাপচার করা হয় এবং যথাযথ ক্লিন-আপ করা হয়। এই থ্রেডগুলি কীভাবে কোনও বাধার অনুরোধের প্রতিক্রিয়া জানানো যায় তা জানতে কোড করা হয়। উচ্চ সংযোগ নকশা।
সুতরাং, এই ক্ষেত্রেগুলিতে আমি একটি শাটডাউন হুক যুক্ত করেছি, যা আমি মনে করি যেটি জেভিএমকে ডিফল্টরূপে করা উচিত: আমার অ্যাপ্লিকেশন দ্বারা তৈরি সমস্ত নন-ডেমন থ্রেডগুলি এখনও চলছে যা বাধা রয়েছে:
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Interrupting threads");
Set<Thread> runningThreads = Thread.getAllStackTraces().keySet();
for (Thread th : runningThreads) {
if (th != Thread.currentThread()
&& !th.isDaemon()
&& th.getClass().getName().startsWith("org.brutusin")) {
System.out.println("Interrupting '" + th.getClass() + "' termination");
th.interrupt();
}
}
for (Thread th : runningThreads) {
try {
if (th != Thread.currentThread()
&& !th.isDaemon()
&& th.isInterrupted()) {
System.out.println("Waiting '" + th.getName() + "' termination");
th.join();
}
} catch (InterruptedException ex) {
System.out.println("Shutdown interrupted");
}
}
System.out.println("Shutdown finished");
}
});
গিথুবে সম্পূর্ণ পরীক্ষার আবেদন: https://github.com/idelvall/kill-test test
kill -9
আমার কাছে বোঝানো হয়েছে: "শুরু হয়ে গেল, ফাউল প্রক্রিয়া, তোমার সাথে দূরে!", যার প্রক্রিয়াটি থেমে থাকবে। অবিলম্বে।