Rumah >Java >javaTutorial >Beberapa cara dan analisis contoh penamatan benang Java

Beberapa cara dan analisis contoh penamatan benang Java

WBOY
WBOYke hadapan
2023-04-27 10:31:071699semak imbas

Beberapa cara dan analisis contoh penamatan benang Java

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

Tiga sebab mengapa utas berakhir

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)

Analisis terperinci1. Gunakan bit bendera untuk melancarkan benang

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.

3. Gunakan interrupt untuk menamatkan thread

Apabila thread berada dalam dua keadaan, gunakan interrpt untuk menamatkan

(1) Thread tidak dalam keadaan tersekat:

Gunakan isInterrupted() untuk menentukan bendera sampukan untuk keluar dari gelung Apabila menggunakan kaedah interrupt(), bendera sampukan akan ditetapkan kepada benar, yang sama seperti menggunakan bendera tersuai untuk. kawal gelung

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam