টাইমার এবং টাইমার টাস্ক বনাম থ্রেড + জাভাতে ঘুম


102

আমি এখানে অনুরূপ প্রশ্নগুলি পেয়েছি তবে আমার সন্তুষ্টির কোনও উত্তর নেই answers তাই আবার প্রশ্নটি rephrasing-

আমার একটি কাজ রয়েছে যা পর্যায়ক্রমিক ভিত্তিতে করা প্রয়োজন (বলুন 1 মিনিটের ব্যবধান)। ঘুমের সাথে অসীম লুপ রয়েছে এমন একটি নতুন থ্রেড তৈরি করার বিপরীতে এটি করার জন্য টাইমারটাস্ক ও টাইমার ব্যবহার করে কী লাভ?

টাইমারটাস্ক ব্যবহার করে কোড স্নিপেট-

TimerTask uploadCheckerTimerTask = new TimerTask(){

 public void run() {
  NewUploadServer.getInstance().checkAndUploadFiles();
 }
};

Timer uploadCheckerTimer = new Timer(true);
uploadCheckerTimer.scheduleAtFixedRate(uploadCheckerTimerTask, 0, 60 * 1000);

থ্রেড এবং স্লিপ ব্যবহার করে কোড স্নিপেট

Thread t = new Thread(){
 public void run() {
  while(true) {
   NewUploadServer.getInstance().checkAndUploadFiles();
   Thread.sleep(60 * 1000);
  }
 }
};
t.start();

যুক্তিটির সম্পাদন যদি অন্তর সময়ের চেয়ে বেশি সময় নেয় তবে যদি আমি নির্দিষ্ট চক্রটি মিস করি তবে আমার সত্যিই চিন্তা করার দরকার নেই।

এই সম্পর্কে মন্তব্য করুন ..

আপডেট:
সম্প্রতি আমি টাইমার বনাম থ্রেড.স্লিপ () ব্যবহারের মধ্যে আরেকটি পার্থক্য পেয়েছি। ধরুন বর্তমান সিস্টেমের সময় সকাল 11 টা যদি আমরা কোনও কারণে সিস্টেমের সময় সকাল 10:00 তে রোলব্যাক করি তবে টাইমারটি সকাল 11:00 টা নাগাদ না হওয়া পর্যন্ত টাস্কটি সম্পাদন বন্ধ করে দেবে, অন্যদিকে থ্রেড.স্লিপ () পদ্ধতিটি কোনও বাধা ছাড়াই টাস্কটি চালিয়ে যেতে থাকবে। এই দু'জনের মধ্যে কী ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার ক্ষেত্রে এটি একটি বড় সিদ্ধান্ত গ্রহণকারী হতে পারে।


21
অর্ডার পয়েন্ট: টাইমার এবং টাইমার টাস্ক অপ্রচলিত এবং কার্যকরভাবে এক্সিকিউটর সার্ভিস দ্বারা প্রতিস্থাপন করা হয়েছে, যদিও আপনার পয়েন্ট এখনও দাঁড়িয়ে আছে।
স্কাফম্যান

টিপটির জন্য ধন্যবাদ, আমি এক্সিকিউটর সার্ভিসটি ব্যবহার করার সিদ্ধান্ত নিয়েছি :)
কেশব

উত্তরের জন্য আপনাকে ধন্যবাদ, অবশ্যই আমাকে আরও বোঝার সুযোগ দিলেন!
কেশব

6
টাইমার অপ্রচলিত নয়, এবং কেবলমাত্র যখন একটি একক থ্রেডের প্রয়োজন হয় তখন এটি পছন্দ করা হয়। ( java.sun.com/javase/6/docs/api/java/util/Timer.html )
জাস্টিন

2
টাইমর এবং টাইমার টাস্ক এখনও জেএমই পরিবেশে কার্যকর যেখানে অ্যাকিউসিটারসিভারসোস নেই (যেহেতু জেএমই জাভা 1.3 ভিত্তিক ...)।
ー パ ー フ ァ ミ コ コ ン

উত্তর:


67

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

মনে রাখবেন যে এটি একটি স্বল্প আকারে পাশাপাশি আপনার নিজের উদাহরণেও লেখা যেতে পারে:

Timer uploadCheckerTimer = new Timer(true);
uploadCheckerTimer.scheduleAtFixedRate(
    new TimerTask() {
      public void run() { NewUploadServer.getInstance().checkAndUploadFiles(); }
    }, 0, 60 * 1000);

যদি টাইমারটি প্রতিদিনের জন্য ব্যবহৃত হয়, 2 নির্দিষ্ট সময় রাত 9 টা এবং 9 টায়, ... মানগুলি কীভাবে দেওয়া যায়? উপরের কোডে ... @ জেড?
gumuruh

12

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


5

আমি জানি না তবে আমি যে প্রোগ্রামটি লিখছিলাম তা টাইমার্স ব্যবহার করছিল এবং এটির স্তূপের আকারটি ক্রমাগত বৃদ্ধি পাচ্ছিল, একবার আমি এটিকে থ্রেড / স্লিপ সমস্যার পরিবর্তিত করে নিলে সমস্যার সমাধান হয়েছিল।


9
টাইমার ক্রমাগত আপডেট হওয়া কাজগুলির একটি সারি তৈরি করে। টাইমারটি হয়ে গেলে, এটি অবিলম্বে আবর্জনা সংগ্রহ করা যাবে না। সুতরাং আরও বেশি টাইমার তৈরি করা হ'ল কেবল আরও বেশি অবজেক্ট যুক্ত করে। থ্রেড.স্লিপ () কেবল থ্রেডকে বিরতি দেয় তাই মেমরির ওভারহেড অত্যন্ত কম থাকে।
ড্যারিল গেরো

4

যদি আপনি থ্রেড ব্যতিক্রম পান এবং নিহত হন, তবে এটি একটি সমস্যা। তবে টাইমারটাস্ক এটির যত্ন নেবে। এটি আগের রান ব্যর্থতা নির্বিশেষে চলবে।


4

Timer ডকুমেন্টেশন থেকে :

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

এর ScheduledThreadExecutorপরিবর্তে পছন্দ করুন Timer:

  • Timerএকক ব্যাকগ্রাউন্ড থ্রেড ব্যবহার করে যা টাইমারের সমস্ত কার্য ক্রমান্বয়ে কার্যকর করতে ব্যবহৃত হয়। সুতরাং কার্যগুলি দ্রুত শেষ করা উচিত অন্যথায় এটি পরবর্তী কার্যগুলি কার্যকর করতে বিলম্ব করবে। তবে ScheduledThreadPoolExecutorআমরা যে কোনও সংখ্যক থ্রেড কনফিগার করতে পারি এবং সরবরাহ করেও সম্পূর্ণ নিয়ন্ত্রণ রাখতে পারি ThreadFactory
  • Timerএটি Object.wait(long)পদ্ধতির ব্যবহার হিসাবে সিস্টেম ঘড়ির প্রতি সংবেদনশীল হতে পারে use তবে ScheduledThreadPoolExecutorহয় না।
  • টাইমারটাস্কে নিক্ষিপ্ত রানটাইম ব্যতিক্রমগুলি সেই নির্দিষ্ট থ্রেডটিকে মেরে ফেলবে, ফলে টাইমারকে মৃত অবস্থায় পরিণত করা হবে যেখানে আমরা এটি পরিচালনা করতে পারি ScheduledThreadPoolExecutorযাতে অন্যান্য কাজগুলি প্রভাবিত না হয়।
  • Timercancelটাইমারটি শেষ করতে এবং কোনও নির্ধারিত কাজগুলি বাতিল করার পদ্ধতি সরবরাহ করে, তবে এটি বর্তমানে সম্পাদনকারী কার্যের সাথে হস্তক্ষেপ করে এবং এটি শেষ করতে দেয় না। তবে যদি টাইমারটি ডেমন থ্রেড হিসাবে চলমান থাকে তবে আমরা এটিকে বাতিল করি বা না করি, সমস্ত ব্যবহারকারীর থ্রেড সম্পাদন শেষ হওয়ার সাথে সাথে এটি সমাপ্ত হবে।

টাইমার বনাম থ্রেড.স্লিপ

টাইমার ব্যবহার করে Object.waitএবং এটি থেকে পৃথকThread.sleep

  1. অপেক্ষমান ( wait) থ্রেডটি notifyঅন্য থ্রেড দ্বারা অবহিত করা (ব্যবহার করা ) যেতে পারে তবে একটি ঘুমন্ত হতে পারে না, এটি কেবল বাধা দেওয়া যেতে পারে।
  2. মনিটর অবজেক্টে সিঙ্ক্রোনাইজ হওয়া একটি ব্লকে একটি অপেক্ষার (এবং বিজ্ঞপ্তি) অবশ্যই ঘটতে হবে যেখানে ঘুম হয় না।
  3. ঘুমানোর সময় লকটি প্রকাশ হয় না, অপেক্ষার জন্য লকটি প্রকাশ করবে অপেক্ষাটির জন্য অপেক্ষা করা হবে।

খুব দরকারী তথ্য, প্লাস একটি থ্রেড ব্যবহার করে s একটি অসীম লুপে ঘুমের ফলে স্বল্প পরিমাণে সময় বিলম্বে উচ্চ সিপিইউ ব্যবহার হতে পারে।
আমির ফো

3

জাভা থ্রেড এবং sleepপদ্ধতি ব্যবহার করে এই কাজটি পরিচালনা করার বিরুদ্ধে একটি গুরুত্বপূর্ণ যুক্তি রয়েছে । আপনি while(true)লুপে অনির্দিষ্টকালের জন্য এবং থ্রেডকে ঘুমিয়ে রেখে হাইবারনেট করতে ব্যবহার করছেন । NewUploadServer.getInstance().checkAndUploadFiles();কিছু সিঙ্ক্রোনাইজড সংস্থান গ্রহণ করলে কী হবে What অন্যান্য থ্রেডগুলি এই সংস্থানগুলিতে অ্যাক্সেস করতে অক্ষম হবে, অনাহার হতে পারে যা আপনার পুরো প্রয়োগকে ধীর করতে পারে। এই ধরণের ত্রুটিগুলি নির্ণয় করা শক্ত এবং তাদের অস্তিত্ব রোধ করা ভাল ধারণা।

অন্যান্য অ্যাপ্রোচ কোডটি আপনার জন্য গুরুত্বপূর্ণ কোডটির সম্পাদনকে ট্রিগার করে, অর্থাত্ সেই সময়কালে সংস্থানগুলি ব্যবহার করে অন্যান্য থ্রেডকে দেওয়ার সময় আপনার পদ্ধতিটি NewUploadServer.getInstance().checkAndUploadFiles();কল করে ।run()TimerTask


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

2

আমি মনে করি আমি আপনার সমস্যাটি বুঝতে পেরেছি, আমি খুব অনুরূপ কিছু দেখছি। আমার টাইমার রয়েছে যা পুনরাবৃত্তি হয়, কিছু প্রতি 30 মিনিট এবং কিছু প্রতি দু'দফা। আমি যা পড়েছি এবং যে মন্তব্যগুলি দেখছি তা থেকে দেখে মনে হচ্ছে আবর্জনা সংগ্রহ কখনই চলবে না কারণ সমস্ত কাজ কখনই সম্পূর্ণ হয় না। আমি ভাবব যে টাইমার ঘুমের সময় আবর্জনা সংগ্রহ চলবে তবে আমি এটি দেখছি না এবং ডকুমেন্টেশন অনুসারে এটি তা হয় না।

আমি মনে করি যে নতুন নতুন থ্রেডগুলি আবর্জনা সংগ্রহ সম্পূর্ণ করে এবং মঞ্জুরি দেয়।

কেউ দয়া করে আমাকে ভুল প্রমাণ করুন, আমার উত্তরাধিকার সূত্রে যা লিখেছি তা আবার লিখতে ব্যথা হতে চলেছে।

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