Apa perbedaan utama antara scheduleAtFixedRate
dan scheduleWithFixedDelay
metode ScheduledExecutorService ?
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("scheduleAtFixedRate: " + new Date());
}
}, 1, 3L , SECONDS);
scheduler.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("scheduleWithFixedDelay: " + new Date());
}
}, 1, 3L , SECONDS);
mereka mencetak tepat pada waktu yang sama, tampaknya dijalankan pada interval yang sama persis.
sumber
Visualisasikan deret waktu
scheduleAtFixedRate
metode pemanggilan . Eksekusi berikutnya akan segera dimulai jika yang terakhir membutuhkan waktu lebih lama dari periode. Jika tidak, itu akan dimulai setelah waktu periode.Rangkaian waktu
scheduleWithFixedDelay
metode pemanggilan . Eksekusi berikutnya akan dimulai setelah waktu tunda antara penghentian satu eksekusi dan dimulainya eksekusi berikutnya, terlepas dari waktu eksekusinyaSemoga dapat membantu Anda
sumber
The
scheduleAtFixedRate()
Metode menciptakan tugas baru dan menyerahkan ke eksekutor setiap periode, terlepas dari apakah atau tidak tugas sebelumnya selesai .Di sisi lain,
scheduleWithFixedDelay()
metode ini membuat tugas baru setelah tugas sebelumnya selesai .sumber
scheduleAtFixedRate
:)Jika Anda membaca Java Doc itu akan lebih jelas
ScheduledFuture scheduleAtFixedRate (Perintah Runnable, long initialDelay, periode panjang, unit TimeUnit) Membuat dan menjalankan tindakan periodik yang diaktifkan pertama setelah penundaan awal yang diberikan, dan selanjutnya dengan periode yang diberikan; Artinya, eksekusi akan dimulai setelah initialDelay lalu initialDelay + period, lalu initialDelay + 2 * periode, dan seterusnya.
ScheduledFuture scheduleWithFixedDelay (perintah Runnable, long initialDelay, long delay, unit TimeUnit) Membuat dan menjalankan tindakan periodik yang diaktifkan pertama setelah penundaan awal yang diberikan, dan kemudian dengan penundaan yang diberikan antara penghentian satu eksekusi dan dimulainya eksekusi berikutnya.
sumber
Ada satu batasan dalam scheduleAtFixedRate jika thread pertama memakan waktu terlalu lama dan tidak berakhir dalam durasi yang ditentukan, maka thread konsutif kedua tidak akan dimulai setelah tugas pertama selesai dan tidak akan segera dimulai saat thread pertama menyelesaikan tugas dan durasi yang diberikan telah berlalu. JVM akan memutuskan kapan tugas berikutnya akan dijalankan.
Saya pikir itu akan membantu Anda memilih metode karena saya mendapat masalah besar
sumber
ScheduledThreadPoolExecutor
(dan yang terakhir memiliki perilaku yang terdefinisi dengan baik)Mari menulis program sederhana:
Dan lihat hasilnya:
PERHATIKAN waktu eksekusi lebih lama dari menunggu
scheduleWithFixedDelay menjaga delay
scheduleAtFixedRate menghapus penundaan
sumber
Jalankan saja, dan Anda akan tahu perbedaannya. Terima kasih
sumber