Saya memiliki kode tempat saya menjadwalkan tugas menggunakan java.util.Timer
. Saya melihat sekeliling dan melihat ExecutorService
dapat melakukan hal yang sama. Jadi pertanyaan ini di sini, sudahkah Anda menggunakan Timer
dan ExecutorService
untuk menjadwalkan tugas, apa manfaat dari satu menggunakan lebih dari yang lain?
Juga ingin memeriksa apakah ada yang menggunakan Timer
kelas dan mengalami masalah yang ExecutorService
diselesaikan untuk mereka.
Jawaban:
Menurut Java Concurrency in Practice :
Timer
bisa peka terhadap perubahan jam sistem,ScheduledThreadPoolExecutor
bukan.Timer
hanya memiliki satu utas eksekusi, sehingga tugas yang berjalan lama dapat menunda tugas lainnya.ScheduledThreadPoolExecutor
dapat dikonfigurasi dengan sejumlah utas. Selanjutnya, Anda memiliki kontrol penuh atas utas yang dibuat, jika Anda mau (dengan menyediakanThreadFactory
).TimerTask
membunuh satu utas itu, sehingga membuatTimer
mati :-( ... yaitu tugas terjadwal tidak akan berjalan lagi.ScheduledThreadExecutor
Tidak hanya menangkap pengecualian runtime, tetapi juga memungkinkan Anda menanganinya jika Anda mau (denganafterExecute
metode override dariThreadPoolExecutor
). Tugas yang melempar pengecualian akan dibatalkan, tetapi tugas lain akan terus berjalan.Jika Anda dapat menggunakannya
ScheduledThreadExecutor
sebagai gantinyaTimer
, lakukanlah.Satu hal lagi ... sementara
ScheduledThreadExecutor
tidak tersedia di perpustakaan Java 1.4, ada Backport JSR 166 (java.util.concurrent
) ke Java 1.2, 1.3, 1.4 , yang memilikiScheduledThreadExecutor
kelas.sumber
Jika tersedia untuk Anda, maka sulit untuk memikirkan alasan untuk tidak menggunakan kerangka kerja Java 5 executor. Panggilan:
akan memberi Anda
ScheduledExecutorService
fungsionalitas yang mirip denganTimer
(yaitu akan berulir tunggal) tetapi aksesnya mungkin sedikit lebih skalabel (di bawah tenda, ia menggunakan struktur bersamaan daripada sinkronisasi lengkap seperti denganTimer
kelas). MenggunakanScheduledExecutorService
juga memberi Anda keuntungan seperti:newScheduledThreadPoolExecutor()
atauScheduledThreadPoolExecutor
)Satu-satunya alasan untuk tetap berpegang pada yang
Timer
dapat saya pikirkan adalah:sumber
TimerTask
mungkin ketersediaanscheduledExecutionTime()
metode yang tampaknya tidak memiliki setara dalamScheduledExecutorService
.ExecutorService lebih baru dan lebih umum. Timer hanyalah utas yang secara berkala menjalankan hal-hal yang telah Anda jadwalkan untuk itu.
ExecutorService dapat berupa kumpulan utas, atau bahkan tersebar di seluruh sistem lain dalam sebuah kluster dan melakukan hal-hal seperti eksekusi batch satu kali, dll ...
Lihat saja apa yang masing-masing menawarkan untuk memutuskan.
sumber
Berikut beberapa praktik yang lebih baik seputar penggunaan Timer:
http://tech.puredanger.com/2008/09/22/timer-rules/
Secara umum, saya akan menggunakan Timer untuk hal-hal yang cepat dan kotor dan Pelaksana untuk penggunaan yang lebih kuat.
sumber
Dari halaman dokumentasi Oracle pada ScheduledThreadPoolExecutor
ExecutorService/ThreadPoolExecutor
atauScheduledThreadPoolExecutor
pilihan yang jelas ketika Anda memiliki banyak utas pekerja.Pro
ExecutorService
lebih dariTimer
Timer
tidak dapat memanfaatkan core CPU yang tersedia tidak sepertiExecutorService
terutama dengan banyak tugas menggunakan rasaExecutorService
seperti ForkJoinPoolExecutorService
menyediakan API kolaboratif jika Anda memerlukan koordinasi antara beberapa tugas. Asumsikan bahwa Anda harus menyerahkan N jumlah tugas pekerja dan menunggu penyelesaiannya. Anda dapat dengan mudah mencapainya dengan invokeAll API. Jika Anda ingin mencapai hal yang sama dengan banyakTimer
tugas, itu tidak mudah.ThreadPoolExecutor menyediakan API yang lebih baik untuk pengelolaan siklus masa pakai Thread.
Sedikit keuntungan:
Sebuah. Anda dapat membuat / mengelola / mengendalikan siklus hidup Thread & mengoptimalkan overhead biaya pembuatan thread
b. Anda dapat mengontrol pemrosesan tugas (Work Stealing, ForkJoinPool, invokeAll) dll.
c. Anda dapat memantau kemajuan dan kesehatan utas
d. Memberikan mekanisme penanganan pengecualian yang lebih baik
sumber
Alasan saya kadang-kadang lebih suka Timer daripada Executors.newSingleThreadScheduledExecutor () adalah bahwa saya mendapatkan kode lebih bersih ketika saya membutuhkan timer untuk mengeksekusi pada daemon thread.
membandingkan
dengan
Saya melakukan ini ketika saya tidak membutuhkan ketahanan dari layanan eksekutor.
sumber