Analisis soalan
Pilihan jawapan ialah C
J: Benang menggunakan kaedah sleep() untuk menggantung benang untuk satu tempoh masa, bukan untuk menamatkannya
B: Apabila mencipta utas baharu, ia tidak memberi kesan pada utas sebelumnya
C: Pengecualian dilemparkan dan utas ditamatkan
D: Ia bukan penamatan, tetapi pendahuluan proses Ia adalah unit peruntukan sumber yang paling asas. Urutan yang berbeza yang dicipta oleh proses yang sama berkongsi sumber ini Apabila utas mempunyai keutamaan yang lebih tinggi, ia akan merampas sumber rangkaian lain , menyebabkan utas lain tidak mempunyai sumber yang tersedia, yang akan menyebabkan sekatan
1 Kaedah larian dilaksanakan dan utas berakhir seperti biasa
2. Benang melemparkan Pengecualian atau Ralat yang tidak ditangkap
3. Panggil terus kaedah Henti benang untuk menamatkan benang (tidak disyorkan, ia boleh menyebabkan kebuntuan dengan mudah)
General run() Selepas kaedah dilaksanakan, benang akan berakhir seperti biasa. Mereka perlu berjalan untuk masa yang lama, jadi mereka perlu menggunakan pembolehubah untuk mengawal gelung
mentakrifkan keluar bendera apabila keluar adalah benar, gelung sementara keluar adalah palsu . Apabila mentakrifkan keluar, gunakan Kata kunci Java yang tidak menentu Tujuan kata kunci ini adalah untuk menyegerakkan keluar Hanya satu utas boleh mengubah suai nilai keluar pada masa yang sama
public class ThreadSafe extends Thread { public volatile boolean exit = false; public void run() { while (!exit){ //do something } } }
2. Gunakan kaedah berhenti. menamatkan benang secara paksa
Anda boleh terus menggunakan thread.stop() dalam program untuk menamatkan benang secara paksa, tetapi kaedah berhenti adalah sangat berbahaya Ia seperti mematikan kuasa komputer secara tiba-tiba dan bukannya mematikan mengikut kepada prosedur biasa. Ia mungkin menghasilkan hasil yang tidak dapat diramalkan. Ia terutamanya tidak selamat : Selepas thread.stop() dipanggil, thread yang mencipta thread anak akan membuang ralat ThreadDeatherror dan melepaskan semua kunci yang dipegang oleh thread anak.
Apabila thread berada dalam dua keadaan, gunakan interrpt untuk menamatkan
(1) Thread tidak dalam keadaan tersekat:
public class MyThread extends Thread { @Override public void run() { try { for (int i = 0; i < 500000; i++) { if (interrupted()) { System.out.println("已经是停止状态了"); throw new InterruptedException();//中断异常 } System.out.println("i=" + (i + 1)); } System.out.println("我在for下面"); } catch (InterruptedException e) { System.out.println("进run方法中的catch了!"); e.printStackTrace(); } } }
(2) Benang berada dalam keadaan tersekat: jika kaedah tidur, tunggu kunci penyegerakan, penerima, terima dan kaedah lain dalam soket digunakan, kaedah interrupt() bagi benang itu dipanggil
public class ThreadInterrupt extends Thread { public void run() { try { sleep(50000); // 延迟50秒 } catch (InterruptedException e) { System.out.println(e.getMessage()); } } public static void main(String[] args) throws Exception { Thread thread = new ThreadInterrupt(); thread.start(); System.out.println("在50秒之内按任意键中断线程!"); System.in.read(); thread.interrupt(); thread.join(); System.out.println("线程已经退出!"); }
Atas ialah kandungan terperinci Beberapa cara dan analisis contoh penamatan benang Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!