Java中一個(gè)線(xiàn)程執(zhí)行死循環(huán)有什么后果
假設(shè)有兩個(gè)線(xiàn)程在并發(fā)運(yùn)行,一個(gè)線(xiàn)程執(zhí)行的代碼中含有一個(gè)死循環(huán)如:while(true)....當(dāng)該線(xiàn)程在執(zhí)行while(true)中代碼時(shí),另一個(gè)線(xiàn)程會(huì)有機(jī)會(huì)執(zhí)行嗎?
示例代碼(代碼來(lái)源于互聯(lián)網(wǎng))
public class Service {
Object object1 = new Object();
public void methodA() {
synchronized (object1) {
System.out.println("methodA begin");
boolean isContinueRun = true;
//在這里執(zhí)行一個(gè)死循環(huán)
while (isContinueRun) {
}
System.out.println("methodA end");
}
}
Object object2 = new Object();
public void methodB() {
synchronized (object2) {
System.out.println("methodB begin");
System.out.println("methodB end");
}
}
}
兩個(gè)線(xiàn)程類(lèi)的實(shí)現(xiàn)如下:
import service.Service;
public class ThreadA extends Thread {
private Service service;
public ThreadA(Service service) {
super();
this.service = service;
}
@Override
public void run() {
service.methodA();
}
}
線(xiàn)程A執(zhí)行methodA(),methodA()中有一個(gè)死循環(huán)
import service.Service;
public class ThreadB extends Thread {
private Service service;
public ThreadB(Service service) {
super();
this.service = service;
}
@Override
public void run() {
service.methodB();
}
}
線(xiàn)程B執(zhí)行methodB(),當(dāng)線(xiàn)程A進(jìn)入methodA()中的while死循環(huán)時(shí),線(xiàn)程B的能不能執(zhí)行完成?
測(cè)試類(lèi)
import service.Service;
import extthread.ThreadA;
import extthread.ThreadB;
public class Run {
public static void main(String[] args) {
Service service = new Service();
ThreadA athread = new ThreadA(service);
athread.start();
ThreadB bthread = new ThreadB(service);
bthread.start();
}
}
由于線(xiàn)程A和線(xiàn)程B獲得的對(duì)象鎖不是同一把鎖,從結(jié)果中可以看出,線(xiàn)程B是可以執(zhí)行完成的。而線(xiàn)程A由于進(jìn)入了while死循環(huán),故線(xiàn)程A一直執(zhí)行運(yùn)行下去了(整個(gè)程序未結(jié)束),但線(xiàn)程B會(huì)結(jié)束。
也就是說(shuō),盡管線(xiàn)程A一直在while中執(zhí)行,需要占用CPU。但是,線(xiàn)程的調(diào)度是由JVM或者說(shuō)是操作系統(tǒng)來(lái)負(fù)責(zé)的,并不是說(shuō)線(xiàn)程A一直在while循環(huán),然后線(xiàn)程B就占用不到CPU了。對(duì)于線(xiàn)程A而言,它就相當(dāng)于一個(gè)“計(jì)算密集型”作業(yè)了。如果我們的while循環(huán)是不斷地測(cè)試某個(gè)條件是否成立,那么這種方式就很浪費(fèi)CPU,可參考一個(gè)具體的實(shí)例:JAVA多線(xiàn)程之線(xiàn)程間的通信方式 中的“線(xiàn)程間的通信方式”第二點(diǎn)while輪詢(xún)。
如果把Service.java修改成如下:
public class Service {
// Object object1 = new Object();
public void methodA() {
synchronized (this) {
System.out.println("methodA begin");
boolean isContinueRun = true;
//在這里執(zhí)行一個(gè)死循環(huán)
while (isContinueRun) {
}
System.out.println("methodA end");
}
}
// Object object2 = new Object();
public void methodB() {
synchronized (this) {
System.out.println("methodB begin");
System.out.println("methodB end");
}
}
}
若線(xiàn)程A先獲得對(duì)象鎖時(shí),由于while循環(huán),線(xiàn)程A一直在while空循環(huán)中。而線(xiàn)程B也因?yàn)闊o(wú)法獲得鎖而執(zhí)行不了methodB()。
可以看出,如果在一個(gè)線(xiàn)程在synchronized方法中無(wú)法退出,無(wú)法將鎖釋放,另一個(gè)線(xiàn)程就只能無(wú)限等待了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)java多線(xiàn)程有所幫助。
相關(guān)文章
細(xì)致解讀希爾排序算法與相關(guān)的Java代碼實(shí)現(xiàn)
這篇文章主要介紹了希爾排序算法與相關(guān)的Java代碼實(shí)現(xiàn),希爾排序的時(shí)間復(fù)雜度根據(jù)步長(zhǎng)序列的不同而不同,需要的朋友可以參考下2016-05-05
簡(jiǎn)單操作實(shí)現(xiàn)Java jsp servlet文件上傳過(guò)程解析
這篇文章主要介紹了簡(jiǎn)單操作實(shí)現(xiàn)Java jsp servlet文件上傳過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
如何解決SpringBoot2.6及之后版本取消了循環(huán)依賴(lài)的支持問(wèn)題
循環(huán)依賴(lài)指的是兩個(gè)或者多個(gè)bean之間相互依賴(lài),形成一個(gè)閉環(huán),SpringBoot從2.6.0開(kāi)始默認(rèn)不允許出現(xiàn)Bean循環(huán)引用,解決方案包括在全局配置文件設(shè)置允許循環(huán)引用存在、在SpringApplicationBuilder添加設(shè)置允許循環(huán)引用、構(gòu)造器注入2024-10-10
深入Spring Boot實(shí)現(xiàn)對(duì)Fat Jar jsp的支持
這篇文章主要介紹了深入Spring Boot實(shí)現(xiàn)對(duì)Fat Jar jsp的支持,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Apache Commons Math3探索之多項(xiàng)式曲線(xiàn)擬合實(shí)現(xiàn)代碼
這篇文章主要介紹了Apache Commons Math3探索之多項(xiàng)式曲線(xiàn)擬合實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10
SpringBoot+kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何結(jié)合kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2024-01-01
Java多線(xiàn)程 ReentrantReadWriteLock原理及實(shí)例詳解
這篇文章主要介紹了Java多線(xiàn)程 ReentrantReadWriteLock原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09

