Cara Menunda Eksekusi Kode di Java

1. Perkenalan

Biasanya program Java menambahkan penundaan atau jeda dalam pengoperasiannya. Ini bisa berguna untuk tempo tugas atau untuk menjeda eksekusi sampai tugas lain selesai.

Tutorial ini akan menjelaskan dua cara untuk mengimplementasikan penundaan di Java.

2. Pendekatan Berbasis Thread

Saat program Java dijalankan, program tersebut memunculkan proses yang berjalan di mesin host. Proses ini berisi setidaknya satu utas - utas utama - tempat program berjalan. Lebih lanjut, Java mengaktifkan multithreading, yang memungkinkan aplikasi membuat utas baru yang berjalan secara paralel, atau secara asinkron, ke utas utama.

2.1. Menggunakan Thread.sleep

Cara cepat dan kotor untuk menjeda di Java adalah memberi tahu utas saat ini untuk tidur selama jangka waktu tertentu. Ini dapat dilakukan menggunakan Thread.sleep (milidetik) :

try { Thread.sleep(secondsToSleep * 1000); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); }

Merupakan praktik yang baik untuk membungkus metode tidur dalam blok coba / tangkap jika ada thread lain yang mengganggu thread tidur. Dalam kasus ini, kita menangkap InterruptedException dan secara eksplisit mengganggu thread saat ini, sehingga dapat ditangkap dan ditangani nanti. Ini lebih penting dalam program multi-utas, tetapi tetap praktik yang baik dalam program utas tunggal jika kita menambahkan utas lain nanti.

2.2. Menggunakan TimeUnit.sleep

Untuk keterbacaan yang lebih baik, kita dapat menggunakan TimeUnit.XXX.sleep (y) , di mana XXX adalah satuan waktu tidur ( DETIK , MENIT , dll.), Dan y adalah jumlah satuan tidur itu. Ini menggunakan Thread.sleep di belakang layar. Berikut adalah contoh sintaks TimeUnit :

try { TimeUnit.SECONDS.sleep(secondsToSleep); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); }

Namun, ada beberapa kelemahan menggunakan metode berbasis thread ini :

  • Waktu tidur tidak tepat, terutama saat menggunakan peningkatan waktu yang lebih kecil seperti milidetik dan nanodetik
  • Saat digunakan di dalam loop, sleep akan sedikit bergeser di antara iterasi loop karena eksekusi kode lain sehingga waktu eksekusi bisa menjadi tidak tepat setelah banyak iterasi

3. Pendekatan Berbasis Layanan Pelaksana

Java menyediakan antarmuka ScheduledExecutorService , yang merupakan solusi yang lebih kuat dan tepat. Antarmuka ini dapat menjadwalkan kode untuk dijalankan satu kali setelah penundaan yang ditentukan atau pada interval waktu tetap.

Untuk menjalankan sepotong kode sekali setelah penundaan, kita dapat menggunakan metode jadwal :

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);

Bagian Classname :: someTask adalah tempat kita menentukan metode yang akan dijalankan setelah penundaan:

  • someTask adalah nama metode yang ingin kita jalankan
  • Classname adalah nama kelas yang berisi metode someTask

Untuk menjalankan tugas pada interval waktu tetap, kita dapat menggunakan metode scheduleAtFixedRate :

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);

Ini akan berulang kali memanggil metode someTask , menjeda untuk delayInSeconds di antara setiap panggilan.

Selain memungkinkan lebih banyak opsi waktu, metode ScheduledExecutorService menghasilkan interval waktu yang lebih akurat, karena mencegah masalah dengan drift.

4. Kesimpulan

Pada artikel ini, kami membahas dua metode untuk membuat penundaan dalam program Java.

Kode lengkap untuk artikel ini dapat ditemukan di Github. Ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankan apa adanya.