كيف يتم جدولة الطريقة المجدولة executorservice.scheduleadfiledrate () تنفيذ الوقت الحقيقي؟

StackOverflow https://stackoverflow.com/questions/1513518

سؤال

لأنني أعمل مهمة مهمة في الوقت نفسه، قارنت عدة طرق للعثور على أفضل طريقة للتأكد من أن مهمتي تنفذ بالفعل في خطوات زمنية ثابتة. بعد حساب الاشتقاق القياسي للخطأ لجميع الأساليب، يبدو أن استخدام الطريقة scheduledExecutorService.scheduleAtFixedRate() يؤدي إلى أفضل النتائج، لكن ليس لدي أدنى فكرة عن سبب ذلك.

هل يعرف أي شخص كيف تعمل هذه الطريقة داخليا؟ كيف يحدد ذلك على سبيل المثال بالمقارنة بسيطة sleep() تأكد من أن المهمة المشار إليها يتم تنفيذها بالفعل في خطوات زمنية ثابتة؟

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

المحلول

لا يمكن ل Java VM "العادي" تقديم أي ضمانات في الوقت الفعلي الصعب حول أوقات التنفيذ (ونتيجة لذلك أيضا حول أوقات الجدولة). إذا كنت بحاجة حقا إلى ضمانات في الوقت الحقيقي الصعب، يجب أن يكون لديك نظرة في وقت حقيقي مثل VM جاوة RTS.. وبعد بالطبع تحتاج إلى نظام التشغيل في الوقت الحقيقي في هذه الحالة أيضا.

فيما يتعلق بالمقارنة مع Thread.Sleep (): ميزة ScheduledExExutorservice.scheduleadfixedrate () مقارنة باستخدام (ساذج) لاستخدام Thread.Sleep () هو أنه لا يتأثر بوقت التنفيذ للمهمة المجدولة. انظر المجوهرات defuturetask.runperiodic () حول كيفية تنفيذ هذا.

نصائح أخرى

يمكنك إلقاء نظرة على تطبيق OpenJDK7 scheduledthreadpoolexecutor.java. وهو الطبقة الوحيدة التي تنفذ واجهة جدولة Createxecutorservice.

ومع ذلك، بقدر ما أعرف أن هناك ضمانا في جدول جدولة executorservice حول الدقة. لذلك حتى إذا كانت قياساتك تظهر أن هذا قد لا يكون ذلك، فقد لا يكون الأمر كذلك إذا قمت بالتبديل إلى نظام أساسي مختلف أو VM أو JDK.

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