欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中一個線程執(zhí)行死循環(huán)有什么后果

 更新時間:2021年04月27日 10:51:46   作者:hapjin  
這篇文章主要為大家詳細介紹了Java中一個線程執(zhí)行死循環(huán)有什么后果,當一個線程在執(zhí)行死循環(huán)時會影響另外一個線程嗎,下面為大家揭曉

假設(shè)有兩個線程在并發(fā)運行,一個線程執(zhí)行的代碼中含有一個死循環(huán)如:while(true)....當該線程在執(zhí)行while(true)中代碼時,另一個線程會有機會執(zhí)行嗎?

示例代碼(代碼來源于互聯(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í)行一個死循環(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");
    }
  }
}

兩個線程類的實現(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();
  }

}

線程A執(zhí)行methodA(),methodA()中有一個死循環(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();
  }

}

線程B執(zhí)行methodB(),當線程A進入methodA()中的while死循環(huán)時,線程B的能不能執(zhí)行完成? 

測試類

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();
  }

}

由于線程A和線程B獲得的對象鎖不是同一把鎖,從結(jié)果中可以看出,線程B是可以執(zhí)行完成的。而線程A由于進入了while死循環(huán),故線程A一直執(zhí)行運行下去了(整個程序未結(jié)束),但線程B會結(jié)束。

也就是說,盡管線程A一直在while中執(zhí)行,需要占用CPU。但是,線程的調(diào)度是由JVM或者說是操作系統(tǒng)來負責(zé)的,并不是說線程A一直在while循環(huán),然后線程B就占用不到CPU了。對于線程A而言,它就相當于一個“計算密集型”作業(yè)了。如果我們的while循環(huán)是不斷地測試某個條件是否成立,那么這種方式就很浪費CPU,可參考一個具體的實例:JAVA多線程之線程間的通信方式 中的“線程間的通信方式”第二點while輪詢。 

如果把Service.java修改成如下:

public class Service {
//  Object object1 = new Object();

  public void methodA() {
    synchronized (this) {
      System.out.println("methodA begin");
      boolean isContinueRun = true;
      //在這里執(zhí)行一個死循環(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");
    }
  }
}

若線程A先獲得對象鎖時,由于while循環(huán),線程A一直在while空循環(huán)中。而線程B也因為無法獲得鎖而執(zhí)行不了methodB()。

可以看出,如果在一個線程在synchronized方法中無法退出,無法將鎖釋放,另一個線程就只能無限等待了。

以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)java多線程有所幫助。

相關(guān)文章

  • 解決Process.getInputStream()阻塞的問題

    解決Process.getInputStream()阻塞的問題

    這篇文章主要介紹了解決Process.getInputStream()阻塞的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • JavaWeb Maven詳解相關(guān)配置

    JavaWeb Maven詳解相關(guān)配置

    這篇文章主要介紹了使用maven架構(gòu)管理開發(fā)的相關(guān)配置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java線程變量ThreadLocal源碼分析

    Java線程變量ThreadLocal源碼分析

    ThreadLocal用來提供線程內(nèi)部的局部變量,不同的線程之間不會相互干擾,這種變量在多線程環(huán)境下訪問時能保證各個線程的變量相對獨立于其他線程內(nèi)的變量,在線程的生命周期內(nèi)起作用,可以減少同一個線程內(nèi)多個函數(shù)或組件之間一些公共變量傳遞的復(fù)雜度
    2022-08-08
  • Java多線程之中斷線程(Interrupt)的使用詳解

    Java多線程之中斷線程(Interrupt)的使用詳解

    interrupt字面上是中斷的意思,但在Java里Thread.interrupt()方法實際上通過某種方式通知線程,并不會直接中止該線程
    2013-05-05
  • ThreadLocal作用原理與內(nèi)存泄露示例解析

    ThreadLocal作用原理與內(nèi)存泄露示例解析

    這篇文章主要為大家介紹了ThreadLocal作用原理與內(nèi)存泄露示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 升級dubbo2.7.4.1版本平滑遷移到注冊中心nacos

    升級dubbo2.7.4.1版本平滑遷移到注冊中心nacos

    這篇文章主要為大家介紹了2.7.4.1的dubbo平滑遷移到注冊中心nacos的兩種版本升級方案,以及為什要升級,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • java反射機制根據(jù)屬性名獲取屬性值的操作

    java反射機制根據(jù)屬性名獲取屬性值的操作

    這篇文章主要介紹了java反射機制根據(jù)屬性名獲取屬性值的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • JAVA語言編程格式高級規(guī)范

    JAVA語言編程格式高級規(guī)范

    這篇文章主要介紹了JAVA語言編程格式高級規(guī)范,需要的朋友可以參考下
    2015-05-05
  • 使用java生成激活碼和密鑰的方法

    使用java生成激活碼和密鑰的方法

    本文主要介紹了java生成激活碼和密鑰的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • java 一個截取字符串的函數(shù)

    java 一個截取字符串的函數(shù)

    java 編寫一個截取字符串的函數(shù),輸入為一個字符串和字節(jié)數(shù),輸出為按字節(jié)截取的字符串。 要求不能出現(xiàn)截半的情況
    2017-02-02

最新評論