一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中一個線程執行死循環有什么后果

Java中一個線程執行死循環有什么后果

2020-04-28 11:25hapjin JAVA教程

這篇文章主要介紹了Java中一個線程執行死循環有什么后果,當一個線程在執行死循環時會影響另外一個線程嗎,下面為大家揭曉

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

示例代碼(代碼來源于互聯網)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Service {
  Object object1 = new Object();
 
  public void methodA() {
    synchronized (object1) {
      System.out.println("methodA begin");
      boolean isContinueRun = true;
      //在這里執行一個死循環
      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");
    }
  }
}

兩個線程類的實現如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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執行methodA(),methodA()中有一個死循環

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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執行methodB(),當線程A進入methodA()中的while死循環時,線程B的能不能執行完成? 

測試類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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獲得的對象鎖不是同一把鎖,從結果中可以看出,線程B是可以執行完成的。而線程A由于進入了while死循環,故線程A一直執行運行下去了(整個程序未結束),但線程B會結束。

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Service {
//  Object object1 = new Object();
 
  public void methodA() {
    synchronized (this) {
      System.out.println("methodA begin");
      boolean isContinueRun = true;
      //在這里執行一個死循環
      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循環,線程A一直在while空循環中。而線程B也因為無法獲得鎖而執行不了methodB()。

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

以上就是本文的全部內容,希望對大家學習java多線程有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 韩国禁片在线观看久 | 国产精品永久免费自在线观看 | 亚欧毛片基地国产毛片基地 | 美女逼逼软件 | 色依依视频视频在线观看 | 色老板视频 | 果冻传媒ⅹxxxxxhd | 韩国美女vip内部2020 | 动漫美女强行被吸乳做羞羞事 | 999任你躁在线精品免费不卡 | 男人猛进女人屁股免费 | 动漫美女被吸乳羞羞小说 | 亚洲成年www | 亚洲一区二区精品推荐 | 日韩操片| 成年人在线免费看 | 日韩不卡一区二区三区 | 欧美成人免费观看bbb | 小寡妇水真多好紧 | 96日本xxxxxxxxx70| 国产短视频精品一区二区三区 | 久久 这里只精品 免费 | 欧美日韩第二页 | 日本高清有码视频 | 成人免费淫片95视频观看网站 | 国产欧美久久久精品影院 | 精品日本一区二区 | 日韩亚洲欧美一区二区三区 | 婷婷丁香色综合狠狠色 | 日本b站一卡二不卡三卡四卡 | 亚洲AV久久无码精品蜜桃 | 星星动漫无删减在线观看 | 久久午夜夜伦痒痒想咳嗽P 久久无码AV亚洲精品色午夜麻豆 | 精品国产一区二区在线观看 | 99热这里只有精 | 午夜视频一区二区 | 国产伦码精品一区二区 | 十大免费批日的软件 | 农夫69小说小雨与农村老太 | 91亚洲专区| 亚洲欧美日韩另类精品一区二区三区 |