Bagaimana metode scheduleExecutorService.scheduleAtFixedRate() memastikan eksekusi waktu nyata?

Karena saya menjalankan tugas waktu kritis setiap detik, saya membandingkan beberapa metode untuk menemukan cara terbaik guna memastikan bahwa tugas saya benar-benar dijalankan dalam langkah waktu tetap. Setelah menghitung derivasi standar kesalahan untuk semua metode, sepertinya penggunaan metode scheduledExecutorService.scheduleAtFixedRate() memberikan hasil terbaik, tetapi saya tidak tahu mengapa demikian.

Adakah yang tahu cara kerja metode itu secara internal? Bagaimana misalnya dibandingkan dengan sleep() sederhana memastikan bahwa tugas yang direferensikan benar-benar dijalankan dalam langkah waktu yang tetap?


person Markus    schedule 03.10.2009    source sumber


Jawaban (2)


Java VM yang 'normal' tidak dapat memberikan jaminan real-time apa pun tentang waktu eksekusi (dan sebagai konsekuensinya juga tentang waktu penjadwalan). Jika Anda benar-benar membutuhkan jaminan real-time, Anda harus melihat VM real-time seperti Jawa RTS. Tentu saja Anda memerlukan OS waktu nyata juga.

Mengenai perbandingan dengan Thread.sleep(): keuntungan dari scheduleExecutorService.scheduleAtFixedRate() dibandingkan dengan penggunaan Thread.sleep() (naif) adalah bahwa hal itu tidak dipengaruhi oleh waktu eksekusi tugas yang dijadwalkan. Lihat ScheduledFutureTask.runPeriodic() tentang cara penerapannya.

person Kutzi    schedule 03.10.2009

Anda dapat melihat implementasi OpenJDK7 dari ScheduledThreadPoolExecutor. java yang merupakan satu-satunya kelas yang mengimplementasikan antarmuka ScheduledExecutorService.

Namun sejauh yang saya tahu ada jaminan di ScheduledExecutorService tentang akurasi. Jadi meskipun pengukuran Anda menunjukkan keakuratannya, hal itu mungkin tidak terjadi jika Anda beralih ke platform lain, vm atau jdk .

person Wolfgang    schedule 03.10.2009
comment
Karena secara internal kelas tersebut sangat sering menggunakan kelas lain, sehingga sangat sulit bagi saya untuk mengikutinya. Namun menurut saya ini mungkin relevan: Saya menemukan bahwa tugas-tugas tersebut dimasukkan ke dalam PriorityQueue, yang mungkin mengurutkan tugas berdasarkan prioritasnya yang berarti waktu pelaksanaan yang diharapkan. Oleh karena itu, sepertinya tidak ada jaminan waktu nyata. Namun mengapa pendekatan ini lebih baik daripada sleep(rate)? Mungkin antrian dapat menjalankan thread dengan prioritas lebih tinggi daripada misalnya pengumpul sampah agar dapat menjalankan tugas hampir secara real-time? - person Markus; 03.10.2009
comment
Apakah maksud Anda sejauh yang saya tahu tidak ada jaminan? - person Michael Easter; 17.01.2012