1. Ikhtisar
Menerapkan fungsi menjalankan tugas secara teratur di Java, terutama menggunakan dua kelas, kelas timer dan timerKask. Pengatur waktu digunakan untuk menjalankan tugas yang ditentukan dalam utas latar belakang sesuai dengan rencana yang ditentukan.
Timertask adalah kelas abstrak, dan subkelasnya mewakili tugas yang dapat direncanakan dengan pengatur waktu. Kode spesifik yang akan dijalankan ditulis dalam metode run yang perlu diimplementasikan TimerTask.
2. Mari kita lihat contoh paling sederhana
Mari kita jelaskan melalui kode
impor java.text.simpledateFormat; import java.util.date; import java.util.timer; import java.util.timertask; timerdemo kelas publik {string statis public getCurrenttime () {tanggal = tanggal baru (); SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); return sdf.format (tanggal); } public static void main (string [] args) melempar InterruptedException {System.out.println ("Mulai utama:"+getCurrentTime ()); startTimer (); Thread.sleep (1000*5); // tidur selama 5 detik system.out.println ("ujung utama:"+getCurrentTime ()); } public static void startTimer () {TimerTask Task = new timerTask () {@Override public void run () {System.out.println ("Tugas run:"+getCurrentTime ()); }}; Timer timer = timer baru (); timer.schedule (tugas, 0); }}Untuk memfasilitasi informasi pengamatan dengan mencetak, kami menambahkan beberapa informasi pencetakan ke metode utama dan disebut thread. Tidur untuk membuat utas utama tidur. Selain itu, metode GetCurrentTime ditambahkan ke kelas untuk mendapatkan tanggal saat ini.
Dalam kode di atas, dalam metode StartTimer, objek Timertask (tugas yang akan dieksekusi oleh timer) dibuat, dan objek timer dibuat, dan metode jadwal kelas timer dipanggil. Kelas timer memiliki beberapa metode jadwal dengan parameter yang berbeda. Apa yang digunakan di sini adalah:
jadwal public void (tugas timertask, penundaan lama)
Arti dari metode ini adalah untuk menjalankan tugas tugas setelah timer akan menunda waktu (milidetik). Jika penundaan negatif atau 0, tugas akan segera dilakukan. Dan itu adalah tugas eksekusi satu kali, dan tugas tidak akan diulang (atau dijadwalkan) kemudian dieksekusi.
Untuk kelas timer, metode dengan fungsi yang sama juga disediakan, sebagai berikut:
Jadwal public void (Tugas Timertask, Waktu Tanggal)
Perbedaan antara metode ini dan metode di atas adalah bahwa metode di atas menentukan bahwa eksekusi ditunda untuk periode waktu, dan metode ini menentukan bahwa eksekusi dilakukan pada titik waktu tertentu. Perhatikan bahwa jika waktu sistem saat ini telah melebihi waktu yang ditentukan oleh waktu parameter, tugas akan segera dieksekusi.
Saat menjalankan kode di atas, kami menemukan bahwa program segera mencetak dua informasi yang mirip dengan yang berikut:
Mulai utama: 2016-01-13 22:23:18
Tugas menjalankan: 2016-01-13 22:23:18
Karena nilai parameter penundaan yang kami lewati ke metode jadwal di sini adalah 0, tugas akan segera dieksekusi, sehingga waktu untuk mencetak dua pernyataan adalah sama, yang seharusnya. Anda dapat mengubah nilai keterlambatan yang masuk sendiri untuk melihat perubahan dalam informasi output. Setelah sekitar 5 detik (mis. Waktu tidur), saya terus mencetak 1 pesan:
Ujung Utama: 2016-01-13 22:23:23
Waktu untuk informasi pencetakan adalah 5 detik singkat dari pernyataan di atas, yang konsisten dengan pengaturan tidur, yang juga sangat masuk akal.
Tetapi kami akan menemukan fenomena yang sangat menarik, dan kami akan menemukan bahwa prosesnya tidak akan keluar. Pada saat ini, utas utama telah berakhir. Ini berarti bahwa setelah timer menyelesaikan tugas, bahkan jika tidak ada tugas yang menunggu untuk dieksekusi nanti, utas latar belakang yang dibuat dalam timer tidak akan segera keluar. Saya memeriksa dokumentasi dokumen Java yang relevan dan menjelaskan bahwa utas timer tidak akan keluar secara aktif dan perlu menunggu pengumpulan sampah, tetapi pengumpulan sampah Java tidak dapat dikendalikan oleh kode itu sendiri, tetapi dikendalikan oleh mesin virtual.
Setelah penelitian, ditemukan bahwa ketika membuat objek timer dan mengeksekusi timer timer = timer baru (); Pernyataan, utas timer akan dibuat. Dengan kata lain, bahkan jika kode di atas tidak memiliki timer.schedule (tugas, 0); pernyataan, program tidak akan keluar. Saya merasa ini sangat tidak masuk akal. Saya mempelajari kode sumber kelas timer lagi dan menemukan bahwa ia juga memiliki konstruktor dengan parameter boolean:
Timer Publik (Boolean Isdaemon)
Seperti yang dapat Anda lihat dari nama parameter, jika nilai parameter benar, utas timer yang dibuat oleh timer adalah utas daemon. Arti dari utas daemon adalah bahwa ketika semua utas pekerja dalam proses Java keluar, benang daemon akan secara otomatis keluar.
Pada saat ini, kita hanya perlu mengubah kode untuk membuat objek timer dalam contoh di atas ke: timer timer = timer baru (true);
Setelah Anda menemukan bahwa program dijalankan, program akan keluar setelah utas utama (utas utama bukanlah utas daemon, tetapi utas pekerja) selesai, yang berarti bahwa utas timer juga keluar, yang berarti bahwa setelah menambahkan parameter yang benar, utas daemon yang dibuat adalah utas daemon.
Tetapi masalahnya adalah bahwa dalam skenario aplikasi nyata, ada banyak utas pekerja yang berjalan dan program tidak akan keluar dengan santai. Jadi bagaimana jika Anda ingin timer keluar atau tutup segera? Kami akan memperkenalkan ini di bawah ini.
3. Keluar dari Timer
Kelas timer menyediakan metode pembatalan untuk membatalkan timer. Memanggil metode Batal akan mengakhiri timer ini dan membuang semua tugas yang dijadwalkan saat ini. Ini tidak mengganggu tugas yang dijalankan saat ini (jika ada). Setelah timer diakhiri, utas eksekusi juga akan berakhir dan tidak ada lagi tugas yang dapat dijadwalkan menurutnya.
Perhatikan bahwa dengan memanggil metode ini dalam metode run dari tugas timer yang disebut timer ini, Anda dapat benar -benar memastikan bahwa tugas yang dieksekusi adalah tugas terakhir yang dieksekusi oleh timer ini. Metode ini dapat dipanggil berulang kali; Namun panggilan kedua dan selanjutnya tidak valid.
Mari kita lihat kode contoh lain:
impor java.text.simpledateFormat; import java.util.date; import java.util.timer; import java.util.timertask; timerdemo kelas publik {string statis public getCurrenttime () {tanggal = tanggal baru (); SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); return sdf.format (tanggal); } public static void main (string [] args) melempar InterruptedException {System.out.println ("Mulai utama:"+getCurrentTime ()); Timer timer = startTimer (); Thread.sleep (1000*5); // tidur selama 5 detik system.out.println ("ujung utama:"+getCurrentTime ()); timer.cancel (); } public static timer startTimer () {TimerTask Task = new timerTask () {@Override public void run () {System.out.println ("Tugas run:"+getCurrentTime ()); }}; Timer timer = timer baru (); timer.schedule (tugas, 0); pengatur waktu kembali; }} Menjalankan program persis sama dengan output dari contoh di atas. Perbedaannya adalah ketika metode utama berakhir. Proses akan keluar secara aktif, yang berarti bahwa utas timer telah ditutup.
Karena kami memanggil metode pembatalan dalam metode utama. Perhatikan bahwa jika Anda tidak memanggil metode pembatalan dalam metode run timertask, pastikan untuk memastikan bahwa tugas yang ingin Anda jalankan telah dimulai atau diselesaikan, jika tidak, jika tugas belum mulai dijalankan. Cukup hubungi Batal, dan semua tugas tidak akan dieksekusi. Misalnya, kode di atas,
Misalnya, dalam kode di atas, jika kita tidak memanggil metode batal dalam metode utama, tetapi tambahkan timer.schedule (tugas, 0); pernyataan dalam metode startTimer dan tambahkan timer.cancel (); Pernyataan Setelah berjalan, Anda akan menemukan bahwa tugas timer tidak akan dieksekusi, karena akan dibatalkan sebelum eksekusi selesai.
4. Jalankan tugas secara teratur
Dalam contoh di atas, kami memperkenalkan tugas satu kali, yaitu, waktu pengatur waktu telah tiba. Setelah tugas dieksekusi, itu tidak akan diulang nanti. Dalam aplikasi yang sebenarnya, ada banyak skenario yang membutuhkan tugas yang sama untuk dieksekusi berulang kali secara teratur. Ada dua situasi: satu adalah untuk melaksanakan tugas sesekali, dan yang lainnya adalah melakukan tugas pada titik waktu tertentu (atau beberapa) setiap hari (atau mingguan, bulanan, dll.).
Mari kita lihat kasus pertama, yang merupakan contoh melaksanakan tugas yang sama setiap 10 detik. Kodenya adalah sebagai berikut:
impor java.text.simpledateFormat; import java.util.date; import java.util.timer; import java.util.timertask; timerdemo kelas publik {string statis public getCurrenttime () {tanggal = tanggal baru (); SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); return sdf.format (tanggal); } public static void main (string [] args) melempar InterruptedException {System.out.println ("Mulai utama:"+getCurrentTime ()); startTimer (); } public static void startTimer () {TimerTask Task = new timerTask () {@Override public void run () {System.out.println ("Tugas run:"+getCurrentTime ()); coba {thread.sleep (1000*3); } catch (InterruptedException e) {E.PrintStackTrace (); }}}; Timer timer = timer baru (); timer.schedule (tugas, 1000*5.1000*10); }} Jalankan program di atas dan informasi output adalah sebagai berikut (karena timer tidak berhenti, dan tugas diulangi, output akan terus menerus output. Hanya beberapa output sebelumnya yang disalin di sini)
Mulai utama: 2016-01-14 08:41:14
Tugas menjalankan: 2016-01-14 08:41:19
Tugas menjalankan: 2016-01-14 08:41:29
Tugas menjalankan: 2016-01-14 08:41:39
Tugas menjalankan: 2016-01-14 08:41:49
Tugas menjalankan: 2016-01-14 08:42:00
Tugas menjalankan: 2016-01-14 08:42:10
Tugas menjalankan: 2016-01-14 08:42:20
Tugas menjalankan: 2016-01-14 08:42:30
Tugas menjalankan: 2016-01-14 08:42:40
Dalam kode di atas, kami memanggil timer.schedule (tugas, 1000*5.1000*10); Ini berarti bahwa tugas ditunda 5 detik, dan kemudian akan diulang setiap 10 detik. Kami mengamati bahwa waktu pencetakan dalam informasi output sama dengan yang diharapkan. Selain itu, dapat dilihat bahwa interval dihitung berdasarkan waktu mulai tugas, yaitu, tidak menunggu 10 detik lagi setelah tugas selesai.
Kelas timer memiliki dua metode untuk mengimplementasikan fungsi -fungsi tersebut, sebagai berikut:
Jadwal Kekosongan Publik (Tugas TimerTask, Penundaan Panjang, Periode Panjang) Jadwal Kemenangan Publik (Tugas TimerTask, Tanggal Pertama, Periode Panjang)
Metode pertama yang kami gunakan di atas kode. Perbedaan antara kedua metode adalah waktu eksekusi pertama. Metode pertama dieksekusi setelah penundaan tertentu dari periode waktu (dalam milidetik); Metode kedua dieksekusi pada titik waktu yang ditentukan.
Pada saat ini, kami mempertimbangkan skenario berikut. Jika waktu eksekusi suatu tugas melebihi waktu tunggu berikutnya, apa yang akan terjadi? Mari kita lihat melalui kode:
impor java.text.simpledateFormat; import java.util.date; import java.util.timer; import java.util.timertask; timerdemo kelas publik {string statis public getCurrenttime () {tanggal = tanggal baru (); SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); return sdf.format (tanggal); } public static void main (string [] args) melempar InterruptedException {System.out.println ("Mulai utama:"+getCurrentTime ()); startTimer (); } public static void startTimer () {TimerTask Task = new TimerTask () {@Override public void run () {System.out.println ("Tugas Mulai:"+getCurrentTime ()); coba {thread.sleep (1000*10); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("Tugas Akhir:"+getCurrentTime ()); }}; Timer timer = timer baru (); timer.schedule (tugas, 1000*5.1000*5); }} Dibandingkan dengan kode sebelumnya, kami hanya mengubah 2 kode dan memodifikasi cetakan. Salah satunya adalah mengubah tidur dalam metode lari menjadi 10 detik, dan yang lainnya adalah mengubah siklus eksekusi tugas menjadi 5 detik. Dengan kata lain, waktu eksekusi tugas melebihi interval antara eksekusi tugas yang berulang. Jalankan program, output sebelumnya adalah sebagai berikut:
Mulai utama: 2016-01-14 09:03:51
Tugas Mulai: 2016-01-14 09:03:56
Akhir Tugas: 2016-01-14 09:04:06
Tugas Mulai: 2016-01-14 09:04:06
Akhir Tugas: 2016-01-14 09:04:16
Tugas Mulai: 2016-01-14 09:04:16
Akhir Tugas: 2016-01-14 09:04:26
Tugas Mulai: 2016-01-14 09:04:26
Akhir Tugas: 2016-01-14 09:04:36
Tugas Mulai: 2016-01-14 09:04:36
Akhir Tugas: 2016-01-14 09:04:46
Tugas Mulai: 2016-01-14 09:04:46
Akhir Tugas: 2016-01-14 09:04:56
Dapat dilihat bahwa setelah setiap tugas dieksekusi, tugas berikutnya akan segera dieksekusi. Karena waktu yang diambil dari awal tugas hingga penyelesaian tugas telah melampaui interval antara pengulangan tugas, eksekusi akan diulang.
5. Jalankan tugas secara teratur (ulangi titik waktu tetap)
Mari kita terapkan fungsi seperti itu, lakukan tugas secara teratur pada pukul 1 pagi setiap hari, yang memiliki fungsi ini dalam banyak sistem, seperti menyelesaikan tugas yang memakan waktu dan memakan sumber daya seperti cadangan data dan statistik data dalam tugas ini. Kodenya adalah sebagai berikut:
Impor java.text.simpledateFormat; import java.util.calendar; import java.util.date; import java.util.timer; import java.util.timertask; tanggal public timerDemo {public static getCurrentTime () {date baru = tanggal baru (); SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); return sdf.format (tanggal); } public static void main (string [] args) melempar InterruptedException {System.out.println ("Mulai utama:" + getCurrentTime ()); startTimer (); } public static void startTimer () {TimerTask Task = new TimerTask () {@Override public void run () {System.out.println ("Tugas Mulai:" + getCurrentTime ()); coba {thread.sleep (1000 * 20); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("Tugas Akhir:" + getCurrentTime ()); }}; Timer timer = timer baru (); timer.schedule (Tugas, BuildTime (), 1000 * 60 * 60 * 24); } private static date buildtime () {calendar calendar = calendar.getInstance (); calendar.set (calendar.hour_of_day, 1); Calendar.set (Calendar.minute, 0); Calendar.set (Calendar.Second, 0); Tanggal Waktu = Calendar.GetTime (); if (time.beFore (tanggal baru ())) {// Jika waktu saat ini setelah 1 pagi, 1 hari diperlukan, jika tidak, tugas akan segera dieksekusi. // Banyak sistem sering perlu melakukan tugas segera ketika sistem dimulai, tetapi mereka perlu menjalankannya pada pukul 1 pagi setiap hari. Apa yang harus saya lakukan? // Ini sangat sederhana, cukup jalankan tugas secara terpisah ketika sistem menginisialisasi panggilan (tidak diperlukan timer, hanya kode untuk menjalankan tugas itu) waktu = addday (waktu, 1); } waktu pengembalian; } private static Date addDay (tanggal tanggal, hari int) {calendar startdt = calendar.getInstance (); startdt.settime (tanggal); startdt.add (calendar.day_of_month, hari); return startdt.getTime (); }}Karena dieksekusi pada interval 24 jam, tidak mungkin menunggu pengamatan output.
6. Ringkasan
Artikel ini memperkenalkan mekanisme cara melakukan tugas -tugas yang tepat waktu menggunakan kelas Timer Java. Dapat dilihat bahwa masih ada banyak cara untuk memperhatikan. Dalam contoh yang diperkenalkan dalam artikel ini, setiap timer hanya sesuai dengan satu tugas.
Konten yang diperkenalkan dalam artikel ini dapat memenuhi sebagian besar skenario aplikasi, tetapi masih ada beberapa masalah, seperti memasukkan beberapa tugas untuk timer? Dapatkah saya menambahkan tugas lagi setelah timer dibatalkan? Metode apa lagi yang tersedia di kelas timer? Pertanyaan -pertanyaan ini akan diperkenalkan di posting blog berikut.
Tautan asli: http://www.cnblogs.com/51kata/p/5128745.html
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.