Dalam artikel ini, kita akan berbicara tentang mekanisme interupsi interupsi utas java.
Utas interupsi
Metode thread.interrupt () dari utas adalah mengganggu utas. Ini akan mengatur bit status interupsi utas, yaitu, diatur ke true. Apakah utas yang terganggu mati, menunggu tugas baru atau terus berjalan ke langkah berikutnya tergantung pada program itu sendiri. Utas akan mendeteksi bendera interupsi ini dari waktu ke waktu untuk menentukan apakah utas harus terganggu (apakah bendera interupsi benar). Itu tidak mengganggu utas berjalan seperti metode berhenti.
Tentukan apakah utas tersebut terganggu
Untuk menentukan apakah suatu utas telah mengirim permintaan interupsi, silakan gunakan metode utas.currentThread (). ISintrupted () (karena tidak akan menghapus bit bendera interupsi segera setelah mengatur bendera interupsi utas ke true, yaitu, itu tidak akan mengatur bendera interupsi menjadi false). Sebagai gantinya, jangan gunakan metode utas.interrupted () (bit bendera interupsi akan dihapus setelah metode dipanggil, yaitu, reset ke false) untuk menilai. Berikut ini adalah metode interupsi utas saat berada dalam satu loop:
while (! thread.currentThread (). isInterrupted () && lebih banyak pekerjaan yang harus dilakukan) {lakukan lebih banyak pekerjaan}Bendera status interupsi
Ada metode berikut dalam mekanisme interupsi interupsi:
Oleh karena itu, mekanisme interupsi interupsi tidak benar -benar mengganggu utas saat ini, tetapi perubahan dalam markup interupsi. Mari kita mengujinya dengan contoh terlebih dahulu.
Public Class InterruptTest {// Waktu yang dikonsumsi di sini digunakan untuk mencetak waktu statis pribadi = 0; private static void resettime () {time = system.currentTimeMillis (); } private static void printContent (string content) {System.out.println (konten + "waktu:" + (System.currentTimeMillis () - time)); } public static void main (string [] args) {test1 (); } private static void test1 () {thread1 thread1 = new thread1 (); thread1.start (); // interupsi interupsi setelah 3 detik penundaan coba {thread.sleep (3000); } catch (InterruptedException e) {E.PrintStackTrace (); } thread1.interrupt (); PrintContent ("Eksekusi Interrupt"); } private static class thread1 memperluas thread {@Override public void run () {resettime (); int num = 0; while (true) {if (isInterrupted ()) {printContent ("Thread saat ini terputus"); merusak; } num ++; if (num % 100 == 0) {printContent ("num:" + num); }}}}}}}Kode di atas adalah untuk memulai utas utas1, dan terus tambahkan 1 ke num di loop whip dari utas utas, dan cetak sekali setiap kelipatan 100 (mencegah pencetakan dari terlalu cepat). Kemudian, setelah tidur selama 3000 milidetik, utas utama memanggil metode interupsi utas utas. Lalu mari kita lihat outputnya:
interupsi interupsi
Dapat dilihat bahwa setelah mengambil sekitar 3000 milidetik, yaitu, setelah utas utama tidur, utas utas berhenti, dan utas utas berhenti karena metode yang terputus dalam loop sementara kembali benar, jadi break keluar dari loop sementara. Dengan kata lain, peran interupsi dan terputus di sini setara dengan peran Setxx dan getxx, mempertahankan variabel boolean.
mengganggu penanganan pengecualian
Tentu saja, mekanisme interupsi bukan hanya perubahan dan deteksi bit status interupsi, tetapi juga dapat menangani pengecualian interupsi. Kita tahu bahwa metode utas.
while (true) {if (isInterrupted ()) {printContent ("Thread saat ini terputus"); merusak; } num ++; // tidur coba {thread.sleep (1); } catch (InterruptedException e) {E.PrintStackTrace (); } if (num % 100 == 0) {printContent ("num:" + num); }}Mari kita lihat hasil output:
interupsi interupsi
Di sini kita akan menemukan bahwa setelah tidur, nilai NUM output secara signifikan lebih kecil (NUMS mencapai 1 miliar ketika mereka tidak tidur, dan tampaknya CPU melakukan operasi sederhana dengan sangat cepat). Haha, tapi ini bukan intinya. Intinya adalah bahwa setelah pengecualian output, output yang terputus mengembalikan false, dan utas thread1 terus dieksekusi, dan tidak keluar dari loop sementara. Jadi mengapa ini? Kami baru saja menambahkan tidur.
Jika ada operasi di utas Thread1 yang perlu menangkap pengecualian Excepted Exception, seperti Sleep Thread, Metode Bergabung, Tunggu Objek, Kondisi Menunggu, dll., Ini memaksa pengecualian Exception Interrupted Exception untuk menangkap, lalu ketika metode utas1. Kemudian dalam loop sementara, pengecualian ini dapat ditangkap dan kemudian setelah pengecualian ini dilemparkan, bendera interupsi utas akan disetel ulang menjadi false segera. Oleh karena itu, ketika itu terputus di waktu berikutnya loop sementara ditentukan untuk salah, itu tidak akan pecah, dan kemudian loop while akan terus dieksekusi.
Oleh karena itu, metode interrupt () akan melakukan operasi yang berbeda berdasarkan apakah ada kode dalam metode run di utas utas yang harus menangkap interupredException:
Skenario aplikasi interupsi
Biasanya interupsi cocok untuk penilaian tanda loop dalam eksekusi utas, misalnya
while (! isInterrupted ()) {...} Namun, jika ada penyumbatan dalam loop ini, utas tidak dapat menilai tag berikutnya yang terputus, dan bahkan jika metode interrupt () dipanggil, ia tidak dapat keluar dari loop, dan utas tidak dapat keluar. Misalnya
while (! isInterrupted ()) {... while (true) {// Thread macet di sini, mekanisme yang terputus tidak dapat ditanggapi}}Dengan cara ini, interupsi akan tidak berdaya, dan utas akan terus mengeksekusi dan tidak akan terganggu dan dihentikan.
Contoh Uji Untuk Melihat GitHub-Javatest saya
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.