Rumah  >  Artikel  >  Java  >  Isu keselamatan berbilang benang dalam Java - penyelesaian kepada java.lang.ThreadDeath

Isu keselamatan berbilang benang dalam Java - penyelesaian kepada java.lang.ThreadDeath

王林
王林asal
2023-06-25 11:22:27897semak imbas

Java ialah bahasa pengaturcaraan yang digunakan secara meluas dalam pembangunan perisian moden, dan keupayaan pengaturcaraan berbilang benangnya juga merupakan salah satu kelebihan terbesarnya. Walau bagaimanapun, disebabkan masalah akses serentak yang disebabkan oleh berbilang benang, isu keselamatan berbilang benang sering berlaku di Jawa. Antaranya, java.lang.ThreadDeath ialah isu keselamatan berbilang benang biasa. Artikel ini akan memperkenalkan punca dan penyelesaian java.lang.ThreadDeath.

1. Sebab untuk java.lang.ThreadDeath

Di Java, thread berhenti biasanya disebabkan oleh dua situasi kerana thread selesai pelaksanaan dan berhenti secara automatik; Untuk situasi terdahulu, mesin maya Java boleh mengendalikannya dengan baik, tetapi untuk situasi yang terakhir, pengecualian java.lang.ThreadDeath terdedah kepada berlaku.

ThreadDeath ialah pengecualian yang sangat istimewa yang hanya boleh dilemparkan oleh mesin maya Java (kelas sun.misc.InnocuousThread). Ia berlaku kerana apabila satu utas cuba menamatkan utas lain, beberapa pengecualian berlaku semasa utas lain sedang menunggu, menyebabkan pelaksanaan utas itu terganggu. Pengecualian jenis ini digunakan untuk menyelaraskan kerjasama antara utas yang berbeza Apabila pengecualian utas berlaku, utas lain akan berhenti menunggu dan menamatkan pelaksanaannya sendiri. java.lang.ThreadDeath dilemparkan oleh pengurus benang, dan biasanya kita tidak seharusnya membuangnya secara eksplisit sendiri.

2. Penyelesaian kepada java.lang.ThreadDeath

Memandangkan java.lang.ThreadDeath ialah pengecualian yang dilemparkan secara automatik oleh mesin maya Java, program tidak dapat menangkap dan mengendalikan pengecualian tersebut. Oleh itu, apabila pengaturcaraan dengan berbilang benang, cuba elakkan menggunakan kaedah seperti stop() dalam utas yang akan menamatkan benang secara paksa, kerana ini boleh menyebabkan pengecualian java.lang.ThreadDeath.

Apabila anda perlu menamatkan benang, anda boleh menetapkan bendera untuk membiarkan benang berhenti secara automatik. Contohnya:

public class MyThread extends Thread {

    private boolean flag = true;

    public void stopThread() {
        flag = false;
    }

    @Override
    public void run() {
        while (flag) {
            // do something
        }
    }
}

Dalam contoh di atas, benang MyThread mempunyai bendera bendera Gelung while dalam kaedah run() akan menentukan sama ada untuk meneruskan pelaksanaan berdasarkan nilai bit bendera. Apabila anda perlu menamatkan benang MyThread, anda boleh memanggil kaedah stopThread() untuk mengubah suai bit bendera supaya benang berhenti secara automatik. Ini boleh mengelak daripada menggunakan kaedah stop() mesin maya Java dalam program dan mengelakkan pengecualian java.lang.ThreadDeath.

Cara lain ialah menggunakan kaedah Thread.interrupt(), yang merupakan cara yang lebih baik untuk membatalkan (atau menghentikan) benang secara paksa. Apabila kita perlu menamatkan benang, kita boleh menggunakan kaedah Thread.interrupt() , yang menghantar isyarat gangguan benang kepada benang sasaran dan memberitahu benang sasaran untuk menghentikan pelaksanaan. Apabila benang sasaran menerima isyarat gangguan, ia boleh memilih untuk meneruskan pelaksanaan atau kembali serta-merta.

Dalam aplikasi berbilang benang anda, katakan ada utas menunggu untuk beberapa acara dan melaksanakan beberapa perkhidmatan luaran. Pada masa ini, anda memohon untuk keluar dari program, tetapi jika anda mahu utas dilaksanakan sehingga perkhidmatan selesai sebelum keluar, anda boleh menghantar isyarat gangguan kepada utas:

Thread serviceThread = new Thread(new YourLongRunningIntervalClass());
serviceThread.start();

// 程序即将结束
serviceThread.interrupt();

Dalam contoh di atas, apabila interrupt() kaedah dijalankan, ia akan dihantar ke serviceThread Interrupt signal, jika thread sedang menunggu acara dan tidak aktif memeriksa status interrupt, thread akan terus menunggu jika thread menyemak status interrupt, ia boleh memilih untuk kembali serta merta.

3. Ringkasan

Pengaturcaraan berbilang benang ialah kelebihan utama Java, tetapi anda juga perlu memberi perhatian kepada keselamatan berbilang benang. Dengan mengelakkan penggunaan kaedah stop() yang disediakan oleh mesin maya Java dan penggunaan rasional kaedah Thread.interrupt(), kami boleh mengelakkan pengecualian java.lang.ThreadDeath dengan berkesan dan menjadikan program kami lebih mantap dan cekap.

Atas ialah kandungan terperinci Isu keselamatan berbilang benang dalam Java - penyelesaian kepada java.lang.ThreadDeath. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn