Dalam pengembangan, kita sering membutuhkan beberapa operasi berkala, seperti melakukan operasi tertentu setiap beberapa menit. Saat ini, kita perlu mengatur timer. Cara paling nyaman dan efisien untuk mengimplementasikannya di Java adalah dengan menggunakan kelas alat java.util.timer, dan kemudian menjadwalkan tugas java.util.timertask.
Timer adalah alat yang menggunakannya untuk mengatur tugas yang akan dieksekusi di utas latar belakang nanti. Tugas dapat dieksekusi sekali, atau mereka dapat dieksekusi berulang kali. Ini sebenarnya adalah utas yang menjadwalkan timertasks yang dimiliki oleh penjadwalan waktu.
Timertask adalah kelas abstrak yang subkelasnya diatur oleh timer sebagai tugas yang dieksekusi atau diulang. Bahkan, ini adalah kelas dengan metode yang dijalankan, dan kode yang perlu dieksekusi secara berkala ditempatkan ke dalam Badan Metode Jalankan.
Java meluncurkan timer timer timer di JDK1.3, dan kemudian Doulea baru mengembangkan jadwaleTreadPoolExecutor yang mendukung multi-threading setelah JDK1.5. Dilihat dari kinerja yang terakhir, kita dapat mempertimbangkan untuk sepenuhnya mengganti timer.
Perbandingan Antara Timer dan JadwalReadPoolExecutor:
1. Timer dimulai dengan JDK1.3. Prinsipnya adalah menggunakan array Timertask sebagai antrian untuk menambahkan semua tugas waktu ke antrian ini. Kemudian mulai utas. Saat antrian kosong, utas akan diblokir. Ketika ada data dalam antrian, utas akan menghapus timertask untuk menilai
Apakah waktu mutakhir, tugas mulai berjalan jika waktu berjalan kurang dari atau sama dengan waktu saat ini. Karena sifat utas tunggal, ia membawa beberapa masalah (kode terperinci nanti):
Pertama, ketika tugas yang kami tambahkan ke timer memakan waktu, karena timer ini mengeksekusi tugas timer dengan cara sekuensial utas tunggal, itu akan mempengaruhi eksekusi tepat waktu dari tugas-tugas berikutnya.
Kode Java
// Contoh masalah: m_timer.scheduleAtFixedrate (TaskUselongtime baru (), 1000, 5000); m_timer.scheduleAtFixedRate (Tasknormal baru (), 5000, 3000); Running result: 14:44:29: timer is sleeping 10 seconds 14:44:39: timer is sleeping 14:44:39: timer is sleeping 10 seconds 14:44:49: Task Normal executed 14:44:49: Task Normal executed 14:44:49: Task Normal executed 14:44:49: Task Normal executed 14:44:49: Task Normal executed 14:44:49: Task Normal executed 14:44:49: Tugas Normal Dieksekusi 14:44:49: Timer tidur 10 detik Hasil Analisis: Tugas Tugas Normal tidak dapat dijamin berjalan sekali setiap 3 detik, ia hanya bisa menunggu TaskUselongtime untuk dijalankan setelah selesai.
Kedua, utas dalam timer hanya akan menangkap pengecualian Exception Interrupted, jadi jika tugas waktu kustom kami tidak menangkap kemungkinan pengecualian dan menyebabkan pengecualian dilemparkan,
// Contoh 2: m_timer.schedule (TaskThrowException baru (), 1000); m_timer.schedule (Tasknormal baru (), 2000); Jalankan Hasil: 14:47:37: Lempar pengecualian pengecualian di utas "Timer-0" java.lang.runtimeException di timer_test.timertest $ TaskThrowException.run (TimerTest.java:85) di java.util.timerThread.mainloop (timer.java: java:util.timerThread.mainloop (timer.java:512) java.util.timerThread.run (timer.java:462) Analisis hasil: Setelah pengecualian dilemparkan oleh tugas, tugas tugas tugas berikutnya tidak dapat terus berjalan.
Ini akan menyebabkan utas timer kami berhenti, sehingga tugas -tugas lain yang lain tidak dapat dieksekusi.
Ketiga, tidak dapat menangani beberapa tugas waktu yang terjadi secara bersamaan
// analisis tiga pertanyaan: m_timer.scheduleatFixedRate (TaskUselongtime baru ("Timer1"), 1000, 15000); m_timer.scheduleAtFixedRate (TaskUselongtime baru ("Timer2"), 1000, 15000); Hasil Menjalankan: 14:50:16: Timer1 tidur 10 detik 14:50:26: Timer2 tidur 10 detik 14:50:36: Timer2 tidur 10 detik Hasil Analisis: Waktu startup saya adalah 1 detik kemudian, tetapi waktu startup antara Timer1 dan Timer2 jelas tidak konsistenContoh kode:
package timer_test;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class TimerTest {private final Timer m_timer = new Timer();public static void main(String[] args) {new TimerTest().test();}public void test() {// Sampel masalah: m_timer.scheduleAtFixedrate (TaskUselongtime baru (), 1000, 5000); m_timer.scheduleatFixedRate (Tasknormal baru (), 5000, 3000); // Contoh 2: // m_timer.schedule (Tugas baru (3000); // m_timer.schedule (Tasknormal baru (), 2000); // Contoh 3: // m_timer.scheduleAtFixedrate (TaskUselongtime baru ("Timer1"), 1000, 5000); // m_timer.scheduleAtFixedRate(new TaskUseLongTime("timer2"), 1000, 5000);}private class TaskUseLongTime extends TimerTask {private String m_taskName = "timer";public TaskUseLongTime(){}public TaskUseLongTime(String taskName) {m_taskName = taskName;}@Override public void run() {try {System.out.println(getCurrentTime()+": "+m_taskName+" is sleeping 10 seconds");Thread.sleep(10000);}catch (InterruptedException e) {}}}private class TaskNormal extends TimerTask {@Override public void run() {System.out.println(getCurrentTime()+": Task Normal executed");}}private class TaskThrowException extends TimerTask {@Override public void run() {System.out.println(getCurrentTime()+": Throw exception");throw new RuntimeException();}}private String getCurrentTime() {return new SimpleDateFormat("HH:mm:ss").format(new Tanggal());}}2.SCHEDULETHREADPOOLEXECUCTOR
JadwaleTreadPoolExecutor dimulai dengan JDK1.5 dan ditulis oleh Mr. Doulea. Ini menggunakan kombinasi pintar ThreadPoolExecutor dan Delayqueue untuk menyelesaikan implementasi timer multi-utas, memecahkan tiga cacat di atas yang disebabkan oleh utas tunggal dalam timer.
Masalah dalam pertanyaan 1 adalah bahwa tugas -tugas selanjutnya tidak dapat diselesaikan tepat waktu karena utas tunggal dieksekusi secara berurutan. Kami melihat bahwa multi-threading dapat dengan mudah menyelesaikan masalah ini. Pada saat yang sama, kami memperhatikan bahwa waktu eksekusi TaskUselongtime adalah 10 -an (silakan lihat kode berikutnya). Kami mengatur waktu interval tugas 5 detik, tetapi dari hasilnya, kami menemukan bahwa interval eksekusi tugas kami adalah 10 detik, sehingga kami dapat menilai bahwa JadwaleTreadPoolExecutor bekerja dalam mode per-per-per -er.
// Masalah 1: m_timer.scheduleatFixedRate (TaskUselongtime baru (), 1000, 5000, Timeunit.Milliseconds); m_timer.scheduleAtFixedRate (TaskNormal baru (), 1000, 5000, TimeUnit.Milliseconds); Hasil Menjalankan: 14:54:37: Tugas Normal Dieksekusi 14:54:37: Timer tidur 10 detik 14:54:42: Tugas Normal Dieksekusi 14:54:47: Tugas Normal Dieksekusi 14:54:47: Tugas Normal Dieksekusi 14:54:47: Timer tidur 10 detik 14:54:52: Tugas normal Eksekusi 14:54:47: Timer tidur 10 detik 14:54:52: Tugas Normal Dieksekusi
Dalam pertanyaan 2, kami menemukan bahwa ketika pengecualian dilemparkan, pelaksanaan tugas tidak mempengaruhi pengoperasian tugas -tugas lain. Pada saat yang sama, kami menemukan bahwa pengecualian kami tidak dilemparkan dalam hasil lari. Ini karena Kelas JadwalETREADPOOLEXECUTOR akan mengembalikan hasil yang dijadwalkan setelah menjalankan tugas waktunya. Apakah hasilnya berhasil atau ada pengecualian, itu akan disimpan di sini.
// Masalah 2: m_timer.scheduleatFixedRate (TaskThrowException baru (), 1000, 5000, Timeunit.Milliseconds); m_timer.scheduleAtFixedRate (TaskNormal baru (), 1000, 5000, TimeUnit.Milliseconds); Running result: 14:58:36: Throw exception 14:58:36: Task Normal executed 14:58:41: Task Normal executed 14:58:46: Task Normal executed 14:58:46: Task Normal executed 14:58:46: Task Normal executed 14:58:51: Task Normal executed 14:58:56: Task Normal executed
Pertanyaan 3 karena multi-utas, kami dapat memastikan bahwa tugas waktu kami dapat dieksekusi pada saat yang sama.
// Masalah 3: m_timer.scheduleatFixedRate (TaskUselongtime baru ("timer1"), 1000, 5000, timeunit.milliseconds); m_timer.scheduleAtFixedRate (TaskUselongtime baru ("Timer2"), 1000, 5000, TimeUnit.Milliseconds); Running result: 15:01:12: timer1 is sleeping 10 seconds 15:01:12: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01:22: timer2 is sleeping 10 seconds 15:01: seconds 15:01:22: timer1 is sleeping 10 seconds 15:01:32: timer1 is sleeping 10 detik 15:01:32: Timer2 tidur 10 detikKode terperinci:
paket timer_test; import java.text.simpledateFormat; impor java.util.date; import java.util.concurrent.callable; import java.util.concurrent.schedulThreadpoolExecutor; impor java.util.conCurrent.TimeTeOLTECICECEXECECECECECECECECECECECUTOR; JadwalTHreadPoolExecutor m_timer = new dijadwalkanThreadPoolExecutor (10); public static void main (string [] args) {scarteethreadpoolExecutortest timerTest = new sclapeethreadpoolExecutortest (); timerTest.test (); try {thread.sepleepleplon (100000); timerTest.test (); try {thread.seepleple (100000) (100000); timertest.test (); try {thread.slepleplep (100000); timerTest.test (); try {thread.seepleplep (100000); timerTest.test (); try {thread.seepleple (100000) {100000); {timerTest.shutdown ();}} public void shutdown () {m_timer.shutdown ();} public void test () {// Pertanyaan 1: // m_timer.scheduleAtFixedrate (TaskUselongtime baru (), 1000, 5000, timeunit.millisecondrate (TaskUselongtime (), 1000, 5000, timeunit.millisecondrate (TaskUselongtime (), 1000, 5000, timeunit.millisecondrate (TaskUselongtime (), 1000, 5000, timeunit.millisecondrate (TaskUselongtime (), 1000, 5000, timeunit.millisecondrate (TaskUselongtime (), 1000, 5000, timeUnit.millisecondrate); // m_timer.scheduleatFixedRate (new Tasknormal (), 1000, 5000, timeunit.milliseconds); // Pertanyaan 2: // m_timer.scheduleAtFixedrate (TaskThrowException baru (), 1000, 5000, Timeunit.Milliseconds); // m_timer.scheduleatFixedRate (new Tasknormal (), 1000, 5000, timeunit.milliseconds); // Masalah 3: m_timer.scheduleatFixedrate (TaskUselongtime baru ("timer1"), 1000, 5000, timeunit.milliseconds); m_timer.scheduleatFixedrate (waktu TaskUselong ("timer2"), 1000, 5000, waktu. Waktu. Callable <Integer>, runnable {private string m_taskname = "timer"; private TaskUselongtime () {} private TaskUselongtime (String TaskName) {m_taskname = TaskName;} public void run () {try {System.out.println (getCurrenttime ()+"+"+"+"+"+" +println (getCurrenttime ()+" detik "); thread.sleep (10000);} catch (interruptedException e) {}} call public integer () melempar pengecualian {run (); return 0;}}@SuppressWarnings (" tidak terpakai ") run public run () run (integer {public run (integer {public run (integer {public run (integer {no -useoid {public run (integer {no -useoid {public run (integer) {System.out.println(getCurrentTime()+": Task Normal executed");}}@SuppressWarnings("unused") private class TaskThrowException implements Callable<Integer>, Runnable {public Integer call() throws Exception {System.out.println(getCurrentTime()+": Throw exception");throw new RuntimeException ();} public void run () {System.out.println (getCurrentTime ()+": lempar pengecualian"); lempar runtimeException baru ();}} string private getCurrentTime () {return new SimpleFormat ("hh: mm: ss"). FORMAT () {return new SimpleFormat ("hh: mm: ss"). FORMAT () {return new SimpleFormat ("hh: mm: ss"). FORMAT () {return new SimpleFormat ("hh: mm: ss"). FORMAT () {return new SimpleFormat ("hh: mm: ss"). FORMAT ()Meringkaskan
Di atas adalah semua tentang diskusi singkat artikel ini tentang sejarah pengembangan timer Java, dan saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke situs ini:
Java mengimplementasikan penguraian kode timer sederhana
Prinsip dan implementasi Timer Java Multithreaded Timer
Contoh Kode Cara Menggunakan Timer Timer Java
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!