Saya menemukan pertanyaan serupa ditanyakan di sini tetapi tidak ada jawaban yang memuaskan saya. Jadi ulangi pertanyaannya lagi-
Saya memiliki tugas yang perlu dilakukan secara berkala (katakanlah interval 1 menit). Apa keuntungan menggunakan Timertask & Timer untuk melakukan ini dibandingkan membuat utas baru yang memiliki loop tak terbatas dengan tidur?
Potongan kode menggunakan timertask-
TimerTask uploadCheckerTimerTask = new TimerTask(){
public void run() {
NewUploadServer.getInstance().checkAndUploadFiles();
}
};
Timer uploadCheckerTimer = new Timer(true);
uploadCheckerTimer.scheduleAtFixedRate(uploadCheckerTimerTask, 0, 60 * 1000);
Potongan kode menggunakan Thread dan sleep-
Thread t = new Thread(){
public void run() {
while(true) {
NewUploadServer.getInstance().checkAndUploadFiles();
Thread.sleep(60 * 1000);
}
}
};
t.start();
Saya benar-benar tidak perlu khawatir jika saya melewatkan siklus tertentu jika eksekusi logika membutuhkan waktu lebih dari interval waktu.
Tolong komentari ini ..
Pembaruan:
Baru-baru ini saya menemukan perbedaan lain antara menggunakan Timer versus Thread.sleep (). Misalkan waktu sistem saat ini adalah 11:00. Jika kita mengembalikan waktu sistem ke 10:00 karena alasan tertentu, Timer akan BERHENTI menjalankan tugas hingga mencapai jam 11:00, sedangkan metode Thread.sleep () akan terus menjalankan tugas tanpa hambatan. Ini bisa menjadi pembuat keputusan utama dalam memutuskan apa yang akan digunakan di antara keduanya.
Jawaban:
Keuntungan dari TimerTask adalah ia mengekspresikan maksud Anda dengan lebih baik (yaitu keterbacaan kode), dan fitur cancel () sudah diimplementasikan.
Perhatikan bahwa itu bisa ditulis dalam bentuk yang lebih pendek serta contoh Anda sendiri:
sumber
Timer / TimerTask juga memperhitungkan waktu eksekusi tugas Anda, jadi akan sedikit lebih akurat. Dan itu lebih baik menangani masalah multithreading (seperti menghindari kebuntuan, dll.). Dan tentu saja biasanya lebih baik menggunakan kode standar yang telah teruji dengan baik daripada larutan buatan sendiri.
sumber
Saya tidak tahu mengapa tetapi program yang saya tulis menggunakan Timer dan ukuran tumpukannya terus meningkat, setelah saya mengubahnya menjadi masalah Thread / sleep yang diselesaikan.
sumber
Jika utas Anda mendapatkan pengecualian dan terbunuh, itu adalah masalah. Tapi TimerTask akan menanganinya. Ini akan berjalan terlepas dari kegagalan dalam proses sebelumnya.
sumber
Dari
Timer
dokumentasi :Jadi Lebih Memilih
ScheduledThreadExecutor
daripadaTimer
:Timer
menggunakan utas latar belakang tunggal yang digunakan untuk menjalankan semua tugas pengatur waktu, secara berurutan. Jadi tugas harus diselesaikan dengan cepat jika tidak maka akan menunda pelaksanaan tugas selanjutnya. Tetapi jikaScheduledThreadPoolExecutor
kita dapat mengkonfigurasi sejumlah utas dan juga dapat memiliki kontrol penuh dengan menyediakanThreadFactory
.Timer
bisa peka terhadap jam sistem karena menggunakanObject.wait(long)
metode. TapiScheduledThreadPoolExecutor
tidak.ScheduledThreadPoolExecutor
sehingga tugas lain tidak terpengaruh.Timer
menyediakancancel
metode untuk menghentikan pengatur waktu dan membuang semua tugas terjadwal, namun itu tidak mengganggu tugas yang sedang dijalankan dan membiarkannya selesai. Tetapi jika timer berjalan sebagai utas daemon maka apakah kita membatalkannya atau tidak, itu akan dihentikan segera setelah semua utas pengguna selesai dijalankan.Timer vs Thread.sleep
Timer memanfaatkan
Object.wait
dan berbeda dariThread.sleep
wait
thread waiting ( ) dapat diberitahukan (menggunakannotify
) oleh thread lain tetapi thread yang sedang tidur tidak dapat, itu hanya dapat diinterupsi.sumber
Ada satu argumen penting yang menentang pengelolaan tugas ini menggunakan utas dan
sleep
metode Java . Anda menggunakanwhile(true)
untuk tetap berada di loop tanpa batas dan menghibernasi utas dengan mengaktifkan mode tidur. Bagaimana jikaNewUploadServer.getInstance().checkAndUploadFiles();
membutuhkan beberapa sumber daya yang disinkronkan. Utas lain tidak akan dapat mengakses sumber daya ini, kelaparan mungkin terjadi yang dapat memperlambat seluruh aplikasi Anda. Jenis kesalahan ini sulit untuk didiagnosis dan sebaiknya dicegah keberadaannya.Pendekatan lain memicu eksekusi kode yang penting bagi Anda, yaitu
NewUploadServer.getInstance().checkAndUploadFiles();
dengan memanggilrun()
metode AndaTimerTask
sementara membiarkan thread lain menggunakan sumber daya untuk sementara.sumber
Saya rasa saya memahami masalah Anda, saya melihat sesuatu yang sangat mirip. Saya memiliki pengatur waktu yang berulang, beberapa setiap 30 menit dan beberapa setiap beberapa hari. Dari yang saya baca dan komentar yang saya lihat, sepertinya pengumpulan sampah tidak akan pernah berjalan karena semua tugas tidak pernah selesai. Saya akan berpikir bahwa pengumpulan sampah akan berjalan ketika pengatur waktu dalam keadaan tidur, tetapi saya tidak melihatnya dan menurut dokumentasi itu tidak.
Saya pikir pemijahan utas baru selesai dan memungkinkan pengumpulan sampah.
Seseorang tolong buktikan saya salah, menulis ulang apa yang saya warisi akan menyebalkan.
sumber