1. Pengenalan
Adalah biasa bagi program Java untuk menambahkan kelewatan atau jeda dalam operasi mereka. Ini dapat berguna untuk mondar-mandir tugas atau menjeda pelaksanaan sehingga tugas lain selesai.
Tutorial ini akan menerangkan dua cara untuk melaksanakan kelewatan di Java.
2. Pendekatan Berasaskan Benang
Apabila program Java dijalankan, ia memunculkan proses yang berjalan di mesin host. Proses ini mengandungi sekurang-kurangnya satu utas - utas utama - di mana program dijalankan. Selanjutnya, Java membolehkan multithreading, yang membolehkan aplikasi membuat utas baru yang berjalan secara selari, atau tidak segerak, ke utas utama.
2.1. Menggunakan Thread.sleep
Cara cepat dan kotor untuk berhenti di Java adalah dengan memberitahu bahawa benang semasa tidur untuk jangka masa yang ditentukan. Ini boleh dilakukan dengan menggunakan Thread.sleep (milisaat) :
try { Thread.sleep(secondsToSleep * 1000); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); }
Adalah praktik yang baik untuk membungkus kaedah tidur dalam blok cubaan / tangkapan sekiranya benang lain mengganggu benang tidur. Dalam kes ini, kami menangkap InterruptException dan secara jelas mengganggu urutan semasa, sehingga dapat ditangkap kemudian dan ditangani. Ini lebih penting dalam program multi-thread, tetapi masih menjadi amalan yang baik dalam program single-thread sekiranya kita menambahkan thread lain kemudian.
2.2. Menggunakan TimeUnit.sleep
Untuk kebolehbacaan yang lebih baik, kita boleh menggunakan TimeUnit.XXX.sleep (y) , di mana XXX adalah unit masa untuk tidur ( SECONDS , MINUTES , etc.), dan y adalah bilangan unit untuk tidur. Ini menggunakan Thread.sleep di belakang tabir. Berikut adalah contoh sintaks TimeUnit :
try { TimeUnit.SECONDS.sleep(secondsToSleep); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); }
Walau bagaimanapun, terdapat beberapa kelemahan menggunakan kaedah berasaskan utas ini :
- Waktu tidur tidak tepat tepat, terutamanya ketika menggunakan kenaikan waktu yang lebih kecil seperti milisaat dan nanodetik
- Apabila digunakan di dalam gelung, tidur akan bergerak sedikit di antara lelaran gelung kerana pelaksanaan kod lain sehingga waktu pelaksanaan dapat menjadi tidak tepat setelah banyak lelaran
3. Pendekatan Berasaskan Perkhidmatan Pelaksana
Java menyediakan ScheduledExecutorService antara muka, yang merupakan penyelesaian yang lebih mantap dan tepat. Antaramuka ini dapat menjadualkan kod untuk dijalankan sekali setelah kelewatan yang ditentukan atau pada selang waktu yang tetap.
Untuk menjalankan sekeping kod sekali selepas penundaan, kita dapat menggunakan kaedah jadual :
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);
Bahagian Classname :: someTask adalah di mana kita menentukan kaedah yang akan dijalankan selepas kelewatan:
- someTask adalah nama kaedah yang ingin kita laksanakan
- Classname adalah nama kelas yang mengandungi kaedah someTask
Untuk menjalankan tugas pada selang masa yang tetap, kita boleh menggunakan scheduleAtFixedRate kaedah:
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);
Ini akan berulang kali memanggil kaedah someTask , berhenti sebentar untuk menundaIndetik antara setiap panggilan.
Selain membolehkan lebih banyak pilihan mengukur masa, ScheduledExecutorService selang masa kaedah kadar hasil yang lebih tepat, kerana ia menghalang isu-isu dengan drift.
4. Kesimpulan
Dalam artikel ini, kami membincangkan dua kaedah untuk membuat kelewatan dalam program Java.
Kod penuh untuk artikel ini boleh didapati di Github. Ini adalah projek berasaskan Maven, jadi mudah diimport dan dijalankan sebagaimana adanya.