سؤال

وجدت مماثلة الأسئلة هنا ولكن لم تكن هناك إجابات مرضية.لذلك إعادة صياغة السؤال مرة أخرى-

لدي مهمة يجب القيام به على أساس دوري (قول 1 دقيقة فترات).ما هو الاستفادة من استخدام Timertask وتوقيت القيام بذلك بدلا من إنشاء موضوع جديد يحتوي على حلقة لانهائية مع النوم ؟

مقتطف الشفرة باستخدام timertask-

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:00 صباحا.إذا كنا التراجع وقت النظام إلى 10:00 صباحا لسبب ما ، الموقت سيتم إيقاف تنفيذ المهمة حتى وصل الى 11:00 صباحا ، بينما الموضوع.النوم() طريقة ستواصل تنفيذ المهمة دون عائق.هذا يمكن أن يكون كبيرا صانع القرار في اتخاذ قرار لاستخدام ما بين هذين.

هل كانت مفيدة؟

المحلول

تتمثل ميزة Timertask هي أنه يعبر عن نيتك أفضل بكثير (قابلية قراءة الكود)، وقد تم تطبيق ميزة إلغاء () بالفعل.

لاحظ أنه يمكن كتابته في شكل أقصر وكذلك مثالك الخاص:

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

نصائح أخرى

يأخذ Timer / TimertAsk أيضا في الاعتبار وقت تنفيذ مهمتك، لذلك سيكون أكثر دقة قليلا. ويتعامل أفضل مع قضايا متعددة التصدأ (مثل تجنب الجمود وغيرها). وبالطبع عادة ما يكون من الأفضل استخدام الرمز القياسي اختباره جيدا بدلا من بعض الحل محلي الصنع.

لا أعرف لماذا، لكن البرنامج الذي كنت أكتبا كان يستخدم مؤقتا وكان حجم كومة الكومة يتزايد باستمرار، بمجرد تغييره إلى مشكلة في الخيط / النوم حلها.

إذا حصلت على استثناء مؤشر ترابط ويقتل مشكلة. لكن تيميرت سوف تعتني به. سيتم تشغيل بغض النظر عن الفشل في المدى السابق.

هناك حجة حاسمة ضد إدارة هذه المهمة باستخدام خيوط جافا و sleep طريقة. انت تستخدم while(true) للبقاء إلى أجل غير مسمى في حلقة ودبابيس الخيط عن طريق وضع النوم. ماذا إذا NewUploadServer.getInstance().checkAndUploadFiles(); يأخذ بعض الموارد المتزامنة. ستكون مواضيع أخرى غير قادرة على الوصول إلى هذه الموارد، قد يحدث الجوع الذي يمكن أن يبطئ تطبيقك بالكامل. من الصعب تشخيص هذه الأنواع من الأخطاء ومنحها أن تمنع وجودها.

يؤدي الابتكار الآخر إلى تنفيذ التعليمات البرمجية الذي يهمك، أي NewUploadServer.getInstance().checkAndUploadFiles(); عن طريق الاتصال. run() طريقة الخاص بك TimerTask أثناء ترك المواضيع الأخرى باستخدام الموارد في الوقت نفسه.

من Timer توثيق:

قدمت Java 5.0 حزمة Java.util.concurrent وواحدة من المرافق المرافق فيها هي جدولة Readuledtrreadpoolexecutor التي تعد تجمع مؤشر ترابط للمهام بشكل متكرر في معدل معين أو تأخير. من الممكن بشكل فعال استبدال أكثر تنوعا للموقت / تركيبة TimerTrask، لأنه يسمح بتحسينات خدمة متعددة، تقبل وحدات زمنية مختلفة، ولا تتطلب Timertask TimeSclassing (مجرد تطبيق Runnable). تكوين ScheduredThreadpoolexecutor مع مؤشر ترابط واحد يجعله يعادل الموقت.

لذلك تفضل ScheduledThreadExecutor بدلا من Timer:

  • Timer يستخدم خلفية خلفية واحدة يستخدم لتنفيذ جميع مهام الموقت، بالتتابع. لذلك يجب أن تكمل المهام بسرعة آخر سوف تؤخر تنفيذ المهام اللاحقة. ولكن في حالة ScheduledThreadPoolExecutor يمكننا تكوين أي عدد من المواضيع ويمكن أن يكون لديك أيضا التحكم الكامل من خلال توفير ThreadFactory.
  • Timer يمكن أن تكون حساسة لساعة النظام لأنها تستخدم Object.wait(long) طريقة. ولكن ScheduledThreadPoolExecutor ليس.
  • استثناءات وقت التشغيل التي ألقيت في Timertask ستقتل هذا الموضوع بالذات، مما يجعل الموقت ميتا حيث يمكننا التعامل مع ذلك ScheduledThreadPoolExecutor بحيث لا تتأثر المهام الأخرى.
  • Timer تقدم cancel الطريقة لإنهاء الموقت وتجاهل أي مهام مجدولة، ومع ذلك لا تتداخل مع المهمة المنفذة حاليا وتتيح لها الانتهاء. ولكن إذا كان Timer يعمل كخيط الخفي، فما إذا كنا نحمله أم لا، سينتهي بمجرد الانتهاء من جميع مؤشرات ترابط المستخدمين.

الموقت vs الخيط

الموقت يستفيد من Object.wait ويختلف عن Thread.sleep

  1. الانتظار (wait) يمكن إعلام الخيط (باستخدام notify) من خلال مؤشر ترابط آخر ولكن لا يمكن أن يكون للنوم، لا يمكن إغلاقه إلا.
  2. يجب أن يحدث الانتظار (والإخطار) في كتلة متزامنة على كائن الشاشة في حين أن النوم لا.
  3. في حين أن النوم لا يطلق على القفل، فإن الانتظار سوف يطلق الإفراج عن القفل الخاص بهذا الانتظار يسمى.

أعتقد أنني أفهم مشكلتك, أنا نرى شيء مماثل جدا.لدي توقيت هذا المتكررة بعض كل 30 دقيقة و بعض كل بضعة أيام.من ما قرأت و التعليقات التي أرى أنها تبدو مثل جمع القمامة سوف ابدأ تشغيل لأن كل مهمة هي كاملة أبدا.أعتقد أن جمع القمامة تشغيل عندما الموقت هو في النوم ، لكن أنا لا أرى ذلك و وفقا للوثائق لا.

أعتقد أن وضع البيض مواضيع جديدة يكمل والسماح جمع القمامة.

شخص ما يرجى يثبت لي خطأ, كتابة ما ورثت سيكون الألم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top