1. Poin Pengetahuan menyela
Ringkasan berikut didasarkan pada JDK8
Artikel ini tidak akan sepenuhnya menjelaskan interupsi, tetapi hanya akan mencantumkan beberapa poin yang lebih penting. Untuk pemahaman yang lengkap tentang Thread. Interrupt, Anda dapat melihat materi referensi.
Berikut adalah beberapa artikel baru yang membantu memahami referensi:
Setelah metode interupsi dipanggil, bendera interupsi diatur ke true untuk utas dalam keadaan yang diblokir. Apakah menanggapi interupsi (menyadari perubahan dalam bit bendera ini) tergantung pada desain API. IO API pemblokiran JDK, blok sinkronisasi yang disinkronkan, dan banyak metode dalam kunci (tidak termasuk lockintertress) tidak menanggapi interupsi. Tentu saja, utas panggilan dapat menggunakan penilaian bit bendera untuk membuat API dirancang dengan sendirinya merespons interupsi.
Setelah metode interupsi dipanggil, interruptedException ** akan dilemparkan ke utas dalam keadaan menunggu/timed_waiting dan bendera interupsi sedikit salah ** akan diatur. Misalnya, setelah utas memanggil thread.sleep, object.wait ().
Jika utas belum dimulai (baru), atau telah berakhir (diakhiri), memanggil interrupt () tidak berpengaruh, dan bendera interupsi tidak akan ditetapkan.
Praktik Terbaik: Terkadang beberapa metode tidak diizinkan untuk terganggu atau dibatalkan dalam desain, tetapi ketika utas lain mengirim permintaan interupsi, mereka juga perlu menjaga tanda untuk memfasilitasi penelepon lain untuk "memahami situasi".
Tugas Publik GetNextTask (BlockingQueue <Keck> antrian) {boolean interrupted = false; coba {while (true) {coba {return queue.take (); } catch (InterruptedException e) {// Tanda status ketergantungan di fianlly interrupted = true; // jatuh dan coba lagi}}} akhirnya {if (interrupted) // komentar di fianlly untuk memastikan bahwa tidak ada utas pemberitahuan interupsi yang hilang.currentThread (). interrupt (); }}Beberapa operasi pembatalan dapat diimplementasikan menggunakan interupsi. Misalnya:
paket bersamaan; impor java.util.concurrent.blockingqueue; impor java.util.concurrent.callable; impor java.util.concurrent.executorservice; impor java.util.concurrent.executors;/** * dibuat oleh wanshao * tanggal: 2017/12 static void main (string [] args) melempar interruptedException {interruptTask interruptTask = new interruptTask (); ExecutorService ExecutorService = Executors.NewsingLetHreadExecutor (); ExecutorService.submit (InterruptTask); Thread.sleep (100); interruptTask.cancel (); ExecutorService.shutdown (); }}/*** Tugas yang merespons interrupt*/class InterruptTask mengimplementasikan Callable <Integer> {private blockingqueue <Keck> antrian; // simpan utas untuk menjadi utas T terganggu; @Override Public Integer Call () melempar InterruptedException {System.out.println ("Mulai tugas yang diblokir"); coba {t = thread.currentThread (); Thread.currentThread (). Sleep (50000); } catch (InterruptedException e) {System.out.println ("Be Interrupted"); e.printstacktrace (); } return 0; } public void cancel () {System.out.println ("Cacel a Task ...."); // memanggil thread.currentThread () di sini akan mendapatkan utas utama, daripada utas di kumpulan utas jika (! T.isInterrupt ()) {t.interrupt (); }}}Meringkaskan
Di atas adalah pembaruan di Java berdasarkan ringkasan JDK8 yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!