Dalam program Java multi-thread, seluruh program tidak akan keluar sampai semua thread selesai dieksekusi. (Perlu dicatat bahwa eksekusi semua thread non-daemon telah selesai; jika sebuah thread menjalankan metode System.exit(), program juga akan keluar.) Terkadang, Anda ingin membatalkan eksekusi sebuah thread, misalnya, jika Anda ingin keluar dari program, atau Anda ingin membatalkan tugas yang sedang dijalankan, dll.
Java menyediakan mekanisme interupsi yang memungkinkan kita secara eksplisit menginterupsi thread yang ingin kita hentikan eksekusinya. Salah satu fitur dari mekanisme interupsi adalah kita dapat memeriksa apakah thread telah diinterupsi dan kemudian memutuskan apakah akan merespons permintaan pembatalan. Thread juga dapat mengabaikan permintaan pembatalan dan melanjutkan eksekusi.
Di bagian ini, contoh program yang kami kembangkan akan membuat thread, dan setelah lima detik, menggunakan mekanisme interupsi untuk menghentikan thread secara paksa.
mengetahuinya
Ikuti langkah-langkah di bawah ini untuk menyelesaikan contoh program.
1. Buat kelas bernama PrimeGenerator dan warisi kelas Thread. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
PrimeGenerator kelas publik memperluas Thread {
2. Tulis ulang metode run() dan tambahkan loop tak terbatas ke dalam metode tersebut. Di dalam loop, periksa apakah bilangan bulat positif berurutan yang dimulai dari 1 adalah bilangan prima melalui perhitungan. Jika demikian, cetak ke konsol. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
@Mengesampingkan
menjalankan kekosongan publik() {
nomor panjang = 1L;
sementara (benar) {
if (isPrime(angka)) {
System.out.printf("Bilangan %d /tis Prime.", bilangan);
}
3. Setelah memproses nomor, periksa apakah thread terputus dengan memanggil metode isInterrupted(). Jika metode ini mengembalikan nilai true, sebuah kalimat dicetak ke konsol dan kemudian eksekusi thread dihentikan. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
jika (terganggu()) {
System.out.println("Generator Utama Telah Terganggu");
kembali;
}
nomor++;
}
}
4. Menerapkan metode isPrime(), yang digunakan untuk menentukan apakah parameter adalah bilangan prima. Jika ya, maka akan menghasilkan nilai benar, jika tidak maka akan menghasilkan nilai salah. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
/**
* Tentukan apakah parameternya bilangan prima
*
* @param number Nomor yang akan dinilai
* @kembali
*/
boolean pribadi isPrime(angka panjang) {
jika (angka <= 2) {
kembali benar;
}
untuk (int i = 2; i < angka; i++) {
jika ((angka % i) == 0) {
kembali salah;
}
}
kembali benar;
}
5. Sekarang, implementasikan kelas utama dari program contoh, kelas Utama, dan metode main(). Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
kelas publik Utama {
public static void main(String[] args) {
6. Buat objek PrimeGenerator dan mulai thread. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
Tugas thread = PrimeGenerator baru();
tugas.mulai();
7. Tunggu lima detik lalu akhiri thread. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
mencoba {
TimeUnit.SECONDS.sleep(5L);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
tugas.interrupt();
8. Jalankan contoh dan lihat hasilnya.
tahu kenapa
Di bawah ini adalah cuplikan contoh eksekusi program. Dari karakter yang dicetak, kita dapat melihat bagaimana thread PrimeGenerator mencetak informasi dan cara menghentikan eksekusinya ketika mendeteksi bahwa thread tersebut terputus.
Copy kode kodenya sebagai berikut:
Nomor 43063 adalah Perdana.
Nomor 43067 adalah Perdana.
Nomor 43093 adalah Perdana.
Nomor 43103 adalah Perdana.
Nomor 43117 adalah Perdana.
Prime Generator telah Terganggu
Thread memiliki fungsi Boolean untuk menunjukkan apakah thread telah terputus. Saat metode interupsi() dipanggil, metode tersebut disetel ke true. Metode isInterrupted() mengembalikan nilai properti saat ini.
tidak pernah berakhir
Thread juga memiliki metode untuk memeriksa apakah thread terputus: metode statis interupsi(), yang dapat memeriksa apakah thread yang sedang dijalankan terputus.
Copy kode kodenya sebagai berikut:
Ada perbedaan besar antara metode isInterrupted() dan metode interupsi(). Yang pertama tidak akan mengubah nilai properti apakah thread terputus; sedangkan yang kedua dapat menyetel nilainya ke false. interupsi() adalah metode statis; disarankan untuk menggunakan metode isInterrupted() untuk pengembangan sehari-hari.
Seperti disebutkan sebelumnya, thread dapat mengabaikan permintaan interupsi dan melanjutkan eksekusi. Namun, ini bukanlah hasil yang kami inginkan.
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 semua kode yang digunakan dalam program contoh.
Kode lengkap kelas PrimeGenerator adalah sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe3;
/**
* Tanggal: 18-09-2013
* Waktu: 11:53
*/
PrimeGenerator kelas publik memperluas Thread {
@Mengesampingkan
menjalankan kekosongan publik() {
nomor panjang = 1L;
sementara (benar) {
if (isPrime(angka)) {
System.out.printf("Bilangan %d /tis Prime./n", bilangan);
}
jika (terganggu()) {
System.out.println("Generator Utama Telah Terganggu");
kembali;
}
nomor++;
}
}
/**
* Tentukan apakah parameternya bilangan prima
*
* @param number Nomor yang akan dinilai
* @kembali
*/
boolean pribadi isPrime(angka panjang) {
jika (angka <= 2) {
kembali benar;
}
untuk (int i = 2; i < angka; i++) {
jika ((angka % i) == 0) {
kembali salah;
}
}
kembali benar;
}
}
Kode lengkap kelas Utama
Copy kode kodenya sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe3;
import java.util.bersamaan.TimeUnit;
/**
* Tanggal: 18-09-2013
* Waktu: 12:33
*/
kelas publik Utama {
public static void main(String[] args) {
Tugas thread = PrimeGenerator baru();
tugas.mulai();
mencoba {
TimeUnit.SECONDS.sleep(5L);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
tugas.interrupt();
}
}