Memahami utas
konsep
Utas adalah utas eksekusi dalam program. Mesin virtual Java memungkinkan aplikasi untuk menjalankan beberapa utas eksekusi secara bersamaan.
Fitur utas
Memiliki keadaan, yang mewakili keadaan utas. Pada saat yang sama, utas di JVM hanya memiliki satu keadaan;
·BARU
Utas yang belum dimulai (utas yang belum dimulai sejak awal program berjalan)
・ Runnable
Utas runnable yang berjalan di JVM, tetapi mungkin menunggu sumber daya lain, seperti CPU.
・ Diblokir
Memblokir utas, menunggu kunci agar memungkinkannya terus berjalan
·MENUNGGU
Tunggu Tak Terbatas (Jalankan lagi di utas yang bergantung pada membiarkannya memasukkan status itu untuk melakukan operasi tertentu)
・ TimeD_Waiting
Tunggu waktunya (jalankan lagi di utas yang bergantung pada membiarkannya memasukkan status itu untuk operasi tertentu dalam waktu tunggu yang ditentukan)
・ Diakhiri
Utas keluar
Memiliki prioritas dan menentukan urutan eksekusi utas;
Integer antara 1 dan 10, nilai default adalah 5. Semakin tinggi nilai, semakin tinggi kemungkinan pelaksanaan, dan prioritas tidak menentukan urutan eksekusi utas.
Prioritas utas anak sama dengan utas induk secara default.
Perhatikan bahwa JVM akan berhenti mengeksekusi semua utas saat:
Metode Exit () runtime (runtime) dipanggil dan panggilan metode diizinkan oleh Manajer Keamanan;
Semua "utas non-daemon" telah berhenti berjalan (terlepas dari apakah mereka berhenti secara normal atau berhenti);
Dapat ditandai sebagai daemon (daemon)
Benang anak dari benang daemon masih utas daemon;
Utas daemon juga merupakan "utas backend", yang umumnya digunakan untuk menjalankan tugas latar belakang, sedangkan utas pengguna umumnya menjalankan tugas tingkat pengguna.
Metode untuk Menghentikan Thread
1. Gunakan bendera keluar untuk membuat utas keluar secara normal, yaitu, utas berakhir setelah metode run selesai.
Ketika metode pengumpulan dieksekusi, utas akan keluar. Tapi terkadang metode run tidak pernah berakhir. Misalnya, menggunakan utas untuk mendengarkan permintaan klien dalam program server, atau tugas lain yang memerlukan pemrosesan loop. Dalam hal ini, tugas -tugas ini biasanya ditempatkan dalam loop, seperti saat loop. Jika Anda ingin loop berjalan selamanya, Anda dapat menggunakan sementara (true) {...} untuk menanganinya. Namun, jika Anda ingin membuat loop saat keluar dalam kondisi tertentu, cara yang paling langsung adalah dengan mengatur bendera tipe boolean dan mengontrol apakah loop whene keluar dengan mengatur bendera ini menjadi benar atau salah. Berikut adalah contoh penghentian utas menggunakan bendera keluar.
Flagexitthread.java
package com.rainmonth;/*** Created by RandyZhang on 2017/3/23.*/public class FlagExitThread extends Thread {public volatile Boolean isExit = false;public FlagExitThread(String name) {super(name);}@Override public void run() {while (!isExit) {System.out.println("I'm running");}}}Democlient.java
Paket com.rainmonth;/*** Dibuat oleh Randyzhang pada 2017/3/23.*/Kelas Publik Democlient {public static void main (string [] args) {System.out.printlinrupt ();} fleagixtread void (); exitbyPlayRuprupt ();} private void (); // exitbyupruprupt ();} private void (); exitbyDruprupt ();} private void (); // exitbyupruprupt ();} private void (); flagexitthread baru (flagexitthread.class.getsimplename ()); flagexitthread.start (); coba {thread.sleep (1000); flagexitthread.isexit = true; flagexitthread.join (); System.out.println ("Thread Exit"); Extit (); }ceptEcreD (); Extit Exit Exit (); {e.printstacktrace ();}} private static void exitbyinterrupt () {flagexitthread flagexitthread = flagexitthread baru (flagexitthread.class.getsimplename ()); System.out.println ("flagexitthread running ..."); {Thread.sleep (1500); System.out.println ("FlagExitThread terputus ..."); flagexitThread.interrupt (); thread.sleep (1500); System.out.println ("Stop Application ...");} Catch (interruptException e) {e.printstacktrace ();Hasil output:
Cetak banyak yang saya jalankan setelah utas keluar.
2. Gunakan metode berhenti untuk secara paksa menghentikan utas (metode ini tidak disarankan, karena berhenti sama dengan menangguhkan dan melanjutkan, dan mungkin juga memiliki hasil yang tidak dapat diprediksi).
Menunjukkan metode panggilan stop (). Deskripsi stop () dalam kode sumber adalah sebagai berikut:
/** Metode ini secara inheren tidak aman. Menghentikan utas dengan* thread. Stop menyebabkannya membuka kunci semua monitor yang* telah dikunci (sebagai konsekuensi alami dari pengecualian* <code> threaddeath </code> yang tidak dicentang menyebarkan tumpukan). Jika* salah satu objek yang sebelumnya dilindungi oleh monitor ini berada dalam* keadaan yang tidak konsisten, benda -benda yang rusak menjadi terlihat oleh* utas lain, yang berpotensi menghasilkan perilaku sewenang -wenang. Banyak* penggunaan <code> berhenti </code> harus diganti dengan kode yang cukup* memodifikasi beberapa variabel untuk menunjukkan bahwa utas target harus* berhenti berjalan. Utas target harus memeriksa variabel ini* secara teratur, dan kembali dari metode yang dijalankan secara tertib* jika variabel menunjukkan bahwa ia harus berhenti berjalan. Jika* utas target menunggu untuk waktu yang lama (pada variabel kondisi,* misalnya), metode <code> interupsi </code> harus digunakan untuk* mengganggu tunggu.*/
Makna umum adalah bahwa rasa tidak aman metode ini melekat. Calling Stop () Untuk mengakhiri utas akan melepaskan semua monitor yang telah dikunci (ini akan menyebabkan pengecualian threaddeath merambat ke atas di sepanjang tumpukan yang akan diperiksa untuk dilemparkan). Jika ada ketidakkonsistenan pada objek yang sebelumnya dilindungi oleh monitor yang dirilis ini dan objek -objek ini terlihat oleh utas lain, ini akan mengarah pada beberapa konsekuensi yang tidak terduga. Apa yang harus menghentikan operasi diganti dengan kode yang hanya perlu memodifikasi kode tertentu untuk menunjukkan bahwa utas target harus berhenti berjalan (Metode 1 seperti ini). Jika utas target menunggu kondisi tertentu (seperti variabel kondisi tertentu) untuk waktu yang lama, kita harus menggunakan metode interupsi untuk mengganggu tunggu (ini adalah metode metode 3).
3. Gunakan metode interupsi untuk mengganggu utas.
Paling interupsi secara harfiah berarti mengakhiri, tetapi jangan mencoba untuk mengakhiri utas dengan memanggil interupsi, karena kadang -kadang bahkan jika Anda memanggil metode, utas akan terus mengeksekusi. Anda dapat mengomentari metode ExitByFlag () di atas, mengaktifkan metode ExitByInterrupt (), dan menemukan bahwa metode interrupt () dipanggil dalam waktu, dan saya menjalankan ... (hasil sistem yang berbeda dan CPU mungkin berbeda). Dapat dilihat bahwa tidak aman untuk menggunakan metode interupsi.
Meringkaskan
Menurut analisis di atas, metode yang paling direkomendasikan adalah yang pertama. Kami dapat mengatur bendera menggunakan variabel bersama dan mengirimkan sinyal untuk menginformasikan utas yang harus diakhiri. Tentu saja, kita harus memastikan bahwa operasi variabel bersama ini sinkron.
Di atas adalah semua konten artikel ini tentang instance utas terminasi java dan pembacaan kode sumber metode stop (). Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!