আপনি জাভাতে কোনও থ্রেডকে কীভাবে হত্যা করবেন?


374

আপনি java.lang.Threadজাভাতে কীভাবে মারবেন ?


2
এখন পর্যন্ত আপনি একটি সুতো মারতে পারবেন না; কারণ ধ্বংস () কখনই ডেড-লক
প্রবণতার

1
আমি সংক্রান্ত উত্তর পছন্দ করা ExecutorStatus: এই প্রশ্নে stackoverflow.com/questions/2275443/how-to-timeout-a-thread
কারবি

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

4
2009 সালে 212 টি উপায়ে কী ধরণের প্রশ্ন আসবে তা আশ্চর্যজনক This এটি অবিলম্বে ধ্বংস হয়ে যাবে।
জোনাথন রেইনহার্ট

7
@ জোনাথনরাইনহার্ট: কেন এমন? এটি একটি আইনী প্রশ্ন বলে মনে হচ্ছে, এমনকি এই দিনগুলি। আপনি যখন পলাতক থ্রেডগুলি ব্যবহার করেন তখন এটি হতাশার কারণ হতে পারে এবং আপনি এটি কোনওভাবে হ্যান্ডেল করতে কেবল অবহেলা ফাংশন ব্যবহার করতে পারেন তা আপনি জানেন না?
টিফুটো

উত্তর:


189

কেন তারা হতাশ হয়েছে সে সম্পর্কে সূরারThread.stop() এই থ্রেডটি দেখুন । এটি কেন একটি খারাপ পদ্ধতি ছিল এবং সাধারণভাবে থ্রেডগুলি নিরাপদে থামাতে কী করা উচিত সে সম্পর্কে বিশদে এটি যায়।

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


1
আপনি যদি থ্রেডটি আটকে রেখেছেন যা আপনি লাইভে () লাইভ করেছেন () টি পরীক্ষা করে থাকেন তবে এটি আপনাকে সত্য করে তুলবে এবং তারা আপনার বর্তমান থ্রেডগ্রুপ [] এ যুক্ত করতে থাকবে, আপনি থ্রেড। এটি এর সমস্ত থ্রেডগুলি মুদ্রণ করবে এবং আপনি যদি আপনার প্রবাহটি পুনরাবৃত্তি করেন তবে আপনি আপনার থ্রেডের একাধিক উদাহরণ দেখতে পাবেন।
এজেড_

3
আপনি যদি কোনও পিসিতে থাকেন তবে সমস্যা নেই তবে আপনি যদি মোবাইলের জন্য একটি সফ্টওয়্যার তৈরি করে থাকেন (অ্যান্ড্রয়েড আমি এটির অভিজ্ঞতা পেয়েছি) তবে আপনি আউটআফমিউরিওর পাবেন
এজেড_

2
এটি লক্ষ করা যায় / হওয়া উচিত, যে পতাকাটির মাধ্যমে স্টপ-রিকোয়েস্টের তাত্ক্ষণিক যোগাযোগ নিশ্চিত করতে, ভেরিয়েবলটি অবশ্যই অস্থির হতে হবে (বা ভেরিয়েবলের অ্যাক্সেস অবশ্যই সিঙ্ক্রোনাইজ করতে হবে), যেমন সুপারিশে বলা হয়েছে।
mtsz

2
এই লিঙ্কটি এই সময়ে হত্যা করা হয়েছে। যদিও আমি আর্কাইভ.অর্গ এ এটির সন্ধান করতে পেরেছিলাম, যদিও: web.archive.org/web/20090202093154/http://java.sun.com/j2se/…
জে টেলর

2
আমি getConnection()থেকে পদ্ধতি ব্যবহার java.sql.DriverManager। যদি সংযোগের প্রত্যয়টি বেশি সময় নেয় আমি সংশ্লিষ্ট থ্রেডটিকে কল করে হত্যা করার চেষ্টা করি Thread.interrupt()তবে এটি থ্রেডকে মোটেই প্রভাবিত করে না। Thread.stop()তবে কাজ করে, যদিও ওরাকল যদি এটা কাজ করা উচিত নয় বলে interrupt()না। আমি ভাবছি কীভাবে এটি কার্যকর হয় এবং অবচয় পদ্ধতি ব্যবহার করা এড়ানো যায়।
ড্যানি লো

129

সাধারণত আপনি না ..

আপনি এটি থ্রেড.ইনটার্নপ্রেট (জাভাদোক লিঙ্ক) ব্যবহার করে যা কিছু করছে তা বিঘ্নিত করতে বলুন

কেন জাভাডোকে রয়েছে তার একটি ভাল ব্যাখ্যা (জাভা টেকনোট লিঙ্ক)


@ ফ্রেড্রিক যখন interrupt()পদ্ধতিটি বলা হয় তখন থ্রেড প্রসঙ্গে কী হবে ? মূল প্রশ্ন প্রতিটি নতুন থ্রেডের জন্য লগ উত্পাদন সম্পর্কিত ।
ABcDexter

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

64

জাভা থ্রেডগুলি হত্যা করা হয় না, তবে থ্রেড থামানো একটি সমবায় উপায়ে করা হয় । থ্রেডটি সমাপ্ত করতে বলা হয় এবং থ্রেডটি তখন নিখুঁতভাবে বন্ধ করতে পারে।

প্রায়শই এমন volatile booleanক্ষেত্র ব্যবহার করা হয় যা সংশ্লিষ্ট মানটিতে সেট করা হলে থ্রেড পর্যায়ক্রমে পরীক্ষা করে শেষ করে।

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

কিছু ব্লক করা গ্রন্থাগার পদ্ধতি বাধা সমর্থন করে।

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

public void run() {
   try {
      while (!interrupted()) {
         // ...
      }
   } catch (InterruptedException consumed)
      /* Allow thread to exit */
   }
}

public void cancel() { interrupt(); }

অনুশীলনে জাভা কনকুরঞ্জি থেকে উত্সযুক্ত কোড উত্স । যেহেতু cancel()পদ্ধতিটি সর্বজনীন, আপনি যেমন চান তেমন অন্য থ্রেডকে এই পদ্ধতিতে ডাকতে দিতে পারেন।


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

@ayvango তারপরে আপনাকে সেই স্ক্রিপ্টটি নিজের স্যান্ডবক্সে চালাতে হবে। জাভা স্যান্ডবক্স মেশিনটিকে অ্যাপ্লিকেশন থেকে রক্ষা করে, একে অপরের থেকে অ্যাপ্লিকেশনটির অংশ নয়।
ডেভিড শোয়ার্জ

@ ডেভিডশওয়ার্টজ আপনার কি বোঝাতে চাইছে যে আমার তখন অন্য জাভা প্ল্যাটফর্মটি ব্যবহার করা উচিত?
আয়ভাঙ্গো

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

প্ল্যাটফর্ম স্তরে সমর্থিত না থাকলে @ ডেভিডশওয়ার্টজ এএসএফআইএকে এই জাতীয় সরঞ্জামগুলি উপস্থিত থাকতে পারে না। তবে অবশ্যই সম্পূর্ণরূপে ব্যাখ্যামূলক স্ক্রিপ্ট ইঞ্জিন দিয়ে কাজটি সমাধান করা যেতে পারে। এটি ইরং এবং অন্যান্য জিনিসগুলি করার মতো হ্রাস গণনা করতে পারে।
আইভ্যাঙ্গো

20

একটি উপায় হ'ল একটি ক্লাস ভেরিয়েবল সেট করা এবং এটিকে সেন্ডিনেল হিসাবে ব্যবহার করা।

Class Outer {
    public static volatile flag = true;

    Outer() {
        new Test().start();
    }
    class Test extends Thread {

        public void run() {
            while (Outer.flag) {
                //do stuff here
            }
        }
    }

}

উপরের উদাহরণে একটি বাহ্যিক শ্রেণীর পরিবর্তনশীল, যেমন পতাকা = সত্য সেট করুন। থ্রেডটিকে 'হত্যা' করতে এটি মিথ্যাতে সেট করুন।


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

12
এটি নির্ভরযোগ্য নয়; volatileএটি যে কোনও জায়গায় সঠিকভাবে কাজ করে তা নিশ্চিত করতে "পতাকা" তৈরি করুন । অভ্যন্তর শ্রেণি স্থির নয়, তাই পতাকাটি একটি উদাহরণ পরিবর্তনশীল হওয়া উচিত। পতাকাটি একটি অ্যাক্সেসর পদ্ধতিতে সাফ করা উচিত যাতে অন্যান্য ক্রিয়াকলাপ (যেমন বিঘ্নিত) সম্পাদন করা যায়। "পতাকা" নামটি বর্ণনামূলক নয়।
এরিকসন

2
আমি রান পদ্ধতিতে "যখন" জিনিসটি পাই না। এর অর্থ এই নয় যে রান পদ্ধতিতে যা কিছু লেখা আছে তার পুনরাবৃত্তি হবে? এটি থ্রেডটি প্রথম স্থানে করতে চেয়েছিল

2
+1 করার সময় (! থ্রেড.কন্ট্রেনথ্রেড () isসই ইন্টারন্টার্পটেড ()) অগ্রাধিকার প্রাপ্ত হয়
টবি

2
উভয় ক্ষেত্রেই ব্যর্থ হয়, উদাহরণস্বরূপ আপনি যখন external // ওপেন এক্সট প্রসেস inside এর মধ্যে একটি বাহ্যিক প্রক্রিয়া খুলেন এবং সেই প্রক্রিয়াটি ফাঁসি দেওয়া হয়, এখন থ্রেডটি কোনওভাবেই বাধাগ্রস্ত হবে না এবং এটি আপনার বুলিয়ান অবস্থার পরীক্ষা করতে শেষ পর্যন্ত পৌঁছবে না এবং আপনি বাম ঝুলন্ত ... উদাহরণস্বরূপ জাভা.এক্সেক ব্যবহার করে একটি পাইথন কনসোল চালু করুন এবং প্রস্থান না লিখে নিয়ন্ত্রণ ফিরে পাওয়ার চেষ্টা করুন, এবং দেখুন যে প্রক্রিয়াটি মেরে ফেলার উপায় আছে কি না .... উপায় নেই এমন পরিস্থিতি থেকে বেরিয়ে
স্পেস রকার

11

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

Thread f = <A thread to be stopped>
Method m = Thread.class.getDeclaredMethod( "stop0" , new Class[]{Object.class} );
m.setAccessible( true );
m.invoke( f , new ThreadDeath() );

2
এটি করার কোনও কারণ নেই, কারণ জনসাধারণকে Thread.stopঅবহেলা করা সত্ত্বেও এটি কল করা সম্ভব ।
Lii

1
@ লিআই Thread.stopএকই কাজ করে তবে অ্যাক্সেস এবং অনুমতিও পরীক্ষা করে। ব্যবহার Thread.stopকরা বরং সুস্পষ্ট এবং আমি কেন এটির Thread.stop0পরিবর্তে কেন ব্যবহার করেছি তা মনে নেই । সম্ভবত Thread.stopআমার বিশেষ ক্ষেত্রে (জাভা 6 তে ওয়েবলোগিক) কাজ করে না। বা হতে পারে কারণ Thread.stopহ্রাস করা হয়েছে এবং সতর্কতার কারণ ঘটেছে।
ভাদিমপ্লাটোভ

1
আমার দৃশ্যে অবিরাম চলমান থ্রেড থামানোর একমাত্র উপায় এটি। কিছু কারণের জন্য। স্টপ () থ্রেডটি থামেনি, তবে স্টপ0 () করেছে
পঞ্চাশ

10

জমা হওয়া মন্তব্যের ভিত্তিতে আমি কয়েকটি পর্যবেক্ষণ যুক্ত করতে চাই।

  1. Thread.stop() সুরক্ষা পরিচালক যদি এটি অনুমতি দেয় তবে একটি থ্রেড বন্ধ করবে।
  2. Thread.stop()বিপদজনক. এই বলে যে, আপনি যদি কোন জেইই পরিবেশে কাজ করছেন এবং কোডটি কল করার বিষয়ে আপনার কোনও নিয়ন্ত্রণ নেই, এটি প্রয়োজনীয় হতে পারে; দেখতে কেন Thread.stop অবচিত?
  3. আপনার কোনও ধারক শ্রমিকের থ্রেড থামানো উচিত নয়। আপনি যদি কোডটি চালাতে চান যা ঝুলতে থাকে, (সাবধানে) একটি নতুন ডেমন থ্রেড শুরু করুন এবং এটি পর্যবেক্ষণ করুন, প্রয়োজনে হত্যা করুন killing
  4. stop()কলিং থ্রেডে একটি নতুন ThreadDeathErrorত্রুটি তৈরি করে এবং তারপরে সেই ত্রুটিটিকে লক্ষ্য থ্রেডে ফেলে দেয় । অতএব, স্ট্যাক ট্রেস সাধারণত মূল্যহীন।
  5. JRE 6 এ, stop()নিরাপত্তা ম্যানেজার দিয়ে চেক এবং তারপর কল stop1()যে কল stop0()stop0()নেটিভ কোড।
  6. জাভা 13- Thread.stop()তে সরানো হয়নি (এখনও), তবে Thread.stop(Throwable)জাভা ১১-এ সরানো হয়েছে ( মেলিং তালিকা , জেডিকে -8204243 )

8

আমি ভোট চাই Thread.stop()

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

এই সমস্ত এবং তিনি সিপিইউ তীব্র হতে পারে এমন প্রতিক্রিয়া প্রক্রিয়াকরণ করতে পারেন। এবং আপনি, একজন বিকাশকারী হিসাবে এটিকে থামাতেও পারবেন না, কারণ আপনি if (Thread.currentThread().isInterrupted())সমস্ত কোডে লাইন ফেলে দিতে পারবেন না ।

সুতরাং কোনও থ্রেডকে জোর করে আটকাতে না পারা অক্ষম।


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

"সুতরাং কোনও থ্রেডকে জোর করে আটকাতে অক্ষমতা এটি অদ্ভুত" " - ... যতক্ষণ না আপনি গভীরভাবে তাকান (জাভা ডিজাইনাররা যেমন করেছেন) এবং সিদ্ধান্তে পৌঁছেছেন যে এমন কোনও প্রযুক্তিগতভাবে কার্যকর সমাধান নেই যা অবচয় করার চেয়ে খারাপ নয় stop
স্টিফেন সি

5

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

এই উদ্দেশ্যে আমি জিলিথ্রেড তৈরি করেছি । ব্যবহারের জন্য এর নির্দেশাবলী দেখুন।


ধন্যবাদ! ঠিক আমি খুঁজছেন ছিল কি!
ডেনিস কোকরিন

4

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

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


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

3

দয়া করে কোনও থ্রেড মেরে ফেলার কোনও উপায় নেই।

আপনি থ্রেডকে বাধা দেওয়ার চেষ্টা করতে পারেন, একটি কমন্স কৌশল হ'ল থ্রেডটি নিজেকে থামানোর জন্য বার্তা দেওয়ার জন্য একটি বিষের বড়ি ব্যবহার করা

public class CancelSupport {
    public static class CommandExecutor implements Runnable {
            private BlockingQueue<String> queue;
            public static final String POISON_PILL  = stopnow”;
            public CommandExecutor(BlockingQueue<String> queue) {
                    this.queue=queue;
            }
            @Override
            public void run() {
                    boolean stop=false;
                    while(!stop) {
                            try {
                                    String command=queue.take();
                                    if(POISON_PILL.equals(command)) {
                                            stop=true;
                                    } else {
                                            // do command
                                            System.out.println(command);
                                    }
                            } catch (InterruptedException e) {
                                    stop=true;
                            }
                    }
                    System.out.println(“Stopping execution”);
            }

    }

}

BlockingQueue<String> queue=new LinkedBlockingQueue<String>();
Thread t=new Thread(new CommandExecutor(queue));
queue.put(“hello”);
queue.put(“world”);
t.start();
Thread.sleep(1000);
queue.put(“stopnow”);

http://anandsekar.github.io/cancel-support-for-threads/


2

সাধারণত আপনি কোনও থ্রেড মেরে, থামেন না বা বাধেন না (বা এটি পরীক্ষা করুন) এটি স্বাভাবিকভাবেই শেষ করতে দিন।

এটা সহজ. থ্রেডের ক্রিয়াকলাপ নিয়ন্ত্রণ করতে আপনি কোনও কোনও লুপ (অস্থির) বুলিয়ান ভেরিয়েবলের ভিতরে রান () পদ্ধতির সাথে একসাথে ব্যবহার করতে পারেন। এটি বন্ধ করতে আপনি সক্রিয় থ্রেড থেকে মূল থ্রেডে ফিরে আসতে পারেন।

আপনি নিখুঁতভাবে একটি থ্রেড হত্যা :)।


1

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

নিয়ন্ত্রিত থ্রেড সমাপ্তির জন্য প্রধান দুটি সঠিক সমাধান রয়েছে:

  • ভাগ করা অস্থির পতাকা ব্যবহার
  • থ্রেড.ইনটারপ্রেট () এবং থ্রেড.ইনটারপ্রেড () পদ্ধতিগুলির জোড় ব্যবহার।

আকস্মিক থ্রেড সমাপ্তি সম্পর্কিত সমস্যাগুলির ভাল এবং বিস্তারিত ব্যাখ্যা পাশাপাশি নিয়ন্ত্রিত থ্রেড সমাপ্তির জন্য ভুল এবং সঠিক সমাধানের উদাহরণগুলি এখানে পাওয়া যাবে:

https://www.securecoding.cert.org/confluence/display/java/THI05-J.+Do+not+use+Thread.stop%28%29+to+terminate+threads


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

1
আশ্চর্যজনক, মিস্টার রাইট ... আপনার যদি কোনও তৃতীয় পক্ষের লাইব্রেরি কল করতে হয়, যার উপর আপনার কোনও নিয়ন্ত্রণ নেই এবং যার একটি বগি সময়সীমা রয়েছে এবং মৃত্যুদন্ড কার্যকর হওয়ার সময় প্রতি 1000-2000 বার একবার ঝুলতে পারে? খারাপ প্রোগ্রামিং অনুশীলন হাহ? ঠিক আছে আপনি যে কোডটি ব্যবহার করছেন সেটিতে আপনার সর্বদা অ্যাক্সেস থাকতে পারে না। যাইহোক, অপ্ট তার নিজের কোড ডিজাইনের সময় কোনও থ্রেডকে কীভাবে মারতে হবে তা কীভাবে জিজ্ঞাসা করছে তা জিজ্ঞাসা করছে ...
আর্টুরাস এম

প্রশ্নটি হল আপনি যখন এমন কোনও থ্রেডটি মেরে ফেলবেন যা মুটেক্সের মালিকানাধীন রয়েছে বা কিছু মেমরি ব্লক বরাদ্দ রয়েছে, বা কোন ইভেন্ট বা ডেটা তৈরি করা উচিত যা অন্য থ্রেডের জন্য অপেক্ষা করছে? আপনার আবেদনের বাকী যুক্তি দিয়ে কী হবে? আপনি সর্বদা ঝুঁকিতে থাকবেন যে ছোট এবং স্পষ্ট সমস্যা জটিল সমস্যায় রূপান্তরিত হবে যা পুনরুত্পাদন এবং তদন্ত করা শক্ত হবে। থ্রেড হত্যা করা অনিরাপদ কারণ এটি আপনার অ্যাপ্লিকেশনটিকে বিভিন্ন রকমের অসঙ্গত অবস্থায় ফেলে দিতে পারে। Cert.org- এ লিঙ্কটি থেকে তথ্যটি একবার দেখুন।
জারাথুস্ট্রআ

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


1

অ্যান্ড্রয়েডে কাজ করতে আমি বাধা পাইনি, তাই আমি এই পদ্ধতিটি ব্যবহার করেছি, পুরোপুরি কাজ করে:

boolean shouldCheckUpdates = true;

private void startupCheckForUpdatesEveryFewSeconds() {
    Thread t = new Thread(new CheckUpdates());
    t.start();
}

private class CheckUpdates implements Runnable{
    public void run() {
        while (shouldCheckUpdates){
            //Thread sleep 3 seconds
            System.out.println("Do your thing here");
        }
    }
}

 public void stop(){
        shouldCheckUpdates = false;
 }

2
অচলিত কীওয়ার্ডটি shouldcheckUpdates এ যুক্ত করা উচিত, থ্রেড স্থানীয় স্টোরেজ সহ কম্পাইলারটি অনুকূল করে তোলে।
ক্লিনাক্স

1

'একটি থ্রেড হত্যা' ব্যবহার করার সঠিক বাক্য নয়। এখানে আমরা ইচ্ছামতো সুদৃ completion়ভাবে সমাপ্তি / থ্রেডের প্রস্থানটি কার্যকর করতে পারি তার একটি উপায় এখানে:

চলমান যা আমি ব্যবহার করেছি:

class TaskThread implements Runnable {

    boolean shouldStop;

    public TaskThread(boolean shouldStop) {
        this.shouldStop = shouldStop;
    }

    @Override
    public void run() {

        System.out.println("Thread has started");

        while (!shouldStop) {
            // do something
        }

        System.out.println("Thread has ended");

    }

    public void stop() {
        shouldStop = true;
    }

}

ট্রিগার ক্লাস:

public class ThreadStop {

    public static void main(String[] args) {

        System.out.println("Start");

        // Start the thread
        TaskThread task = new TaskThread(false);
        Thread t = new Thread(task);
        t.start();

        // Stop the thread
        task.stop();

        System.out.println("End");

    }

}

থাইল্যান্ড স্থানীয় স্টোরেজ সহ কম্পাইলারটি অনুকূল হয়ে যায়, যদি অস্থায়ী কীওয়ার্ডটি shouldstop ভেরিয়েবলের সাথে যুক্ত করা উচিত।
ওলেকসেই কিসলিটসিন

0

থ্রেড.স্টপকে অবমূল্যায়ন করা হয়েছে তাই আমরা কীভাবে জাভাতে কোনও থ্রেড থামাব?

বাতিল করার অনুরোধ করতে সর্বদা বিঘ্নিত পদ্ধতি এবং ভবিষ্যত ব্যবহার করুন

  1. যখন টাস্কটি বাধা সংকেতকে প্রতিক্রিয়া জানায়, উদাহরণস্বরূপ, সারি ব্লক করা পদ্ধতি গ্রহণ করুন।
Callable < String > callable = new Callable < String > () {
    @Override
    public String call() throws Exception {
        String result = "";
        try {
            //assume below take method is blocked as no work is produced.
            result = queue.take();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return result;
    }
};
Future future = executor.submit(callable);
try {
    String result = future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException e) {
    logger.error("Thread timedout!");
    return "";
} finally {
    //this will call interrupt on queue which will abort the operation.
    //if it completes before time out, it has no side effects
    future.cancel(true);
}
  1. যখন কার্যটি বাধাগ্রস্ত সিগন্যালের প্রতিক্রিয়া জানায় না u মনে করুন কাজটি সকেট I / O সম্পাদন করে যা বিঘ্নিত সিগন্যালের প্রতিক্রিয়া দেয় না এবং এইভাবে উপরোক্ত পদ্ধতির সাহায্যে কার্যটি বাতিল হয়ে যায় না, ভবিষ্যতে সময় শেষ হয়ে যায় তবে অবশেষে ব্লকের বাতিলকরণের কোনও প্রভাব থাকবে না , থ্রেড সকেট শুনতে থাকবে। পুলের মাধ্যমে প্রয়োগ করা হলে আমরা সংকেতটিতে সকেটটি বন্ধ করতে বা বন্ধ করার পদ্ধতিটি কল করতে পারি।
public interface CustomCallable < T > extends Callable < T > {
    void cancel();
    RunnableFuture < T > newTask();
}

public class CustomExecutorPool extends ThreadPoolExecutor {
    protected < T > RunnableFuture < T > newTaskFor(Callable < T > callable) {
        if (callable instanceof CancellableTask)
            return ((CancellableTask < T > ) callable).newTask();
        else
            return super.newTaskFor(callable);
    }
}

public abstract class UnblockingIOTask < T > implements CustomCallable < T > {
    public synchronized void cancel() {
        try {
            obj.close();
        } catch (IOException e) {
            logger.error("io exception", e);
        }
    }

    public RunnableFuture < T > newTask() {
        return new FutureTask < T > (this) {
            public boolean cancel(boolean mayInterruptIfRunning) {
                try {
                    this.cancel();
                } finally {
                    return super.cancel(mayInterruptIfRunning);
                }
            }

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