Misalkan ada dua utas yang berjalan secara bersamaan, dan kode yang dieksekusi oleh satu utas berisi loop dead seperti: sementara (benar) ... Ketika utas mengeksekusi kode sementara (benar), akankah utas lainnya memiliki kesempatan untuk dieksekusi?
Kode sampel (kode berasal dari internet)
layanan kelas publik {objek objek1 = objek baru (); public void methoda () {disinkronkan (objek1) {System.out.println ("Methoda begin"); boolean iscontinuerun = true; // jalankan loop dead di sini sementara (isContinuerun) {} system.out.println ("Methoda end"); }} Objek objek2 = objek baru (); public void methodB () {disinkronkan (objek2) {System.out.println ("MethodB begin"); System.out.println ("Methodb End"); }}} Implementasi dua kelas utas adalah sebagai berikut:
impor service.service; kelas publik threada memperluas thread {private service service; Threada publik (layanan layanan) {super (); this.service = layanan; } @Override public void run () {service.methoda (); }} Thread A mengeksekusi methoda (), dan ada loop dead di methoda ()
Impor Service.Service; Public Class ThreadB Extends Thread {Private Service Service; threadb publik (layanan layanan) {super (); this.service = layanan; } @Override public void run () {service.methodb (); }}Thread B mengeksekusi methodB (). Ketika utas A memasuki loop dead saat di methoda (), dapatkah utas B mengeksekusi dan menyelesaikannya?
Kelas tes
impor service.service; import extthread.threada; import extthread.threadb; kelas publik run {public static void main (string [] args) {service service = new service (); Threada athread = threada baru (layanan); athread.start (); ThreadB bthread = new threadB (layanan); bthread.start (); }}Karena kunci objek yang diperoleh oleh Thread A dan Thread B bukanlah kunci yang sama, dapat dilihat dari hasil bahwa Thread B dapat dieksekusi dan diselesaikan. Karena utas A memasuki loop sementara, utas A terus mengeksekusi dan dijalankan (seluruh program belum berakhir), tetapi Thread B akan berakhir.
Artinya, meskipun Thread A selalu mengeksekusi sementara, perlu mengambil CPU. Namun, penjadwalan utas adalah tanggung jawab JVM atau sistem operasi. Itu tidak berarti bahwa Thread A terus -menerus melingkar sementara, dan kemudian Thread B tidak akan menempati CPU. Untuk utas A, itu setara dengan pekerjaan "komputasi-intensif". Jika loop sementara kami terus menguji apakah suatu kondisi tertentu benar, maka metode ini adalah pemborosan CPU. Anda dapat merujuk pada contoh spesifik: "Metode komunikasi antar-thread" dalam metode komunikasi antara utas java java titik java dari "metode komunikasi antar-thread" titik kedua saat pemungutan suara.
Jika service.java dimodifikasi sebagai berikut:
layanan kelas publik {// objek objek1 = objek baru (); public void methoda () {disinkronkan (this) {System.out.println ("Methoda begin"); boolean iscontinuerun = true; // jalankan loop dead di sini sementara (isContinuerun) {} system.out.println ("Methoda end"); }} // objek objek2 = objek baru (); public void methodB () {disinkronkan (this) {System.out.println ("MethodB begin"); System.out.println ("Methodb End"); }}}Jika utas A memperoleh kunci objek terlebih dahulu, utas A selalu berada di loop sementara karena loop while. Thread B tidak dapat mengeksekusi methodB () karena tidak dapat memperoleh kunci.
Dapat dilihat bahwa jika satu utas tidak dapat keluar dalam metode yang disinkronkan dan tidak dapat melepaskan kunci, utas lainnya hanya dapat menunggu tanpa batas.
Di atas adalah semua tentang artikel ini. Saya harap ini akan membantu semua orang untuk belajar java multithreading.