Terkadang, kita perlu menginterupsi thread yang sedang berjalan pada titik waktu tertentu. Misalnya, thread yang memeriksa status sensor setiap menit sekali. Selebihnya, thread tidak perlu melakukan apa pun. Selama waktu ini, thread tidak perlu menggunakan sumber daya komputer apa pun. Setelah periode waktu ini berlalu, dan ketika mesin virtual Java menjadwalkan thread, thread akan terus dieksekusi. Untuk melakukan ini, Anda dapat menggunakan metode sleep() dari kelas Thread. Metode ini menunda eksekusi thread dengan mode tidur, dan parameter tipe integer menentukan jumlah milidetik untuk mode tidur. Ketika metode sleep() dipanggil dan waktu tidur selesai, mesin virtual Java mengalokasikan waktu berjalan CPU ke thread, dan thread akan terus dieksekusi.
Cara lain untuk menggunakan metode sleep() adalah melalui elemen tipe enumerasi TimeUnit. Metode ini menggunakan metode thread sleep() untuk membuat thread saat ini tertidur. Metode ini dapat menerima satuan waktu yang ditentukan sebagai parameter dan mengubahnya menjadi jumlah milidetik yang sesuai.
Pada bagian ini, kita akan mengembangkan program yang menggunakan metode sleep() untuk mencetak waktu saat ini setiap detik.
mengetahuinya
Ikuti langkah-langkah yang ditunjukkan di bawah ini untuk menerapkan contoh di bagian ini.
1. Buat kelas bernama FileClock dan implementasikan antarmuka Runnable. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
FileClock kelas publik mengimplementasikan Runnable {
2. Menerapkan metode run(). Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
@Mengesampingkan
menjalankan kekosongan publik() {
3. Tulis loop yang melintasi sepuluh kali. Dalam setiap iterasi, buat objek Date dan cetak ke konsol. Kemudian, panggil metode sleep() melalui properti SECONDS TimeUtil untuk menunda eksekusi thread selama satu detik. Saya pikir metode sleep() akan memunculkan InterruptedException. Oleh karena itu, kita perlu menulis beberapa baris kode lagi untuk menangkap pengecualian. Ketika thread mungkin terganggu, praktik terbaiknya adalah melepaskan atau menutup sumber daya yang digunakan dalam thread. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
untuk (int saya = 0; saya < 10; saya++) {
System.out.printf("%s/n", Tanggal baru());
mencoba {
TimeUnit.SECONDS.sleep(1);
} tangkapan (InterruptedException e) {
System.out.printf("FileClock telah terganggu./n");
}
}
4. Kami sudah memiliki kelas thread yang diimplementasikan dengan baik. Sekarang, mari kita implementasikan kelas utama. Buat kelas bernama FileMain dan implementasikan metode main(). Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
FileMain kelas publik {
public static void main(String[] args) {
5. Buat objek FileClock, lalu buat thread untuk melakukan tugas. Kemudian, mulai threadnya. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
Jam FileClock = FileClock baru();
Utas utas = Utas baru (jam);
thread.mulai();
6. Di thread utama, panggil metode sleep() melalui properti SECONDS TimeUtil untuk menunggu selama lima detik. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
mencoba {
TimeUnit.SECONDS.sleep(5);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
7. Interupsi thread FileClock. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
thread.interrupt();
8. Jalankan contoh dan periksa efek eksekusi.
tahu kenapa
Saat Anda menjalankan program ini, Anda akan menemukan bagaimana program mencetak objek tanggal setiap detik dan bagaimana thread diinterupsi.
Ketika metode sleep() dipanggil, thread akan meninggalkan CPU dan menghentikan eksekusi untuk jangka waktu tertentu. Selama waktu ini, thread tidak lagi membutuhkan CPU, sehingga CPU dapat melakukan tugas lainnya.
Ketika thread tidur terganggu, InterruptedException akan segera dilempar alih-alih menunggu hingga thread tidur berakhir.
tidak pernah berakhir
Di API konkurensi Java, ada metode lain yang memungkinkan thread melepaskan CPU. Ini adalah metode hasil(). Memanggil metode ini akan mengirimkan pesan ke mesin virtual Java yang menunjukkan bahwa thread dapat menyerahkan CPU ke thread lain. Mesin virtual Java tidak menjamin akan merespons permintaan ini. Biasanya, metode ini hanya digunakan saat men-debug program.
Gunakan doktrin
Artikel ini diterjemahkan dari "Buku Masak Konkurensi Java 7" (D Gua Ge mencurinya sebagai "Koleksi Contoh Konkurensi Java7") dan hanya digunakan sebagai bahan pembelajaran. Ini tidak boleh digunakan untuk tujuan komersial apa pun tanpa izin.
Keberhasilan kecil
Versi lengkap dari kode contoh yang digunakan di bagian ini.
Kode lengkap kelas FileClock adalah sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe5;
import java.util.Date;
import java.util.bersamaan.TimeUnit;
/**
* Cetak tanggal dan waktu saat ini ke konsol setiap detik.
* Tanggal: 18-09-2013
* Waktu: 23:11
*/
FileClock kelas publik mengimplementasikan Runnable {
@Mengesampingkan
menjalankan kekosongan publik() {
untuk (int saya = 0; saya < 10; saya++) {
System.out.printf("%s/n", Tanggal baru());
mencoba {
TimeUnit.SECONDS.sleep(1);
} tangkapan (InterruptedException e) {
System.out.printf("FileClock telah terganggu./n");
}
}
}
Kode lengkap kelas FileMain
Copy kode kodenya sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe5;
import java.util.bersamaan.TimeUnit;
/**
* Demo thread tidur dan melanjutkan
* Tanggal: 19-09-2013
* Waktu: 00:29
*/
FileMain kelas publik {
public static void main(String[] args) {
Jam FileClock = FileClock baru();
Utas utas = Utas baru (jam);
thread.mulai();
mencoba {
TimeUnit.SECONDS.sleep(5);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();
}
}