国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - JAVA教程 - Java中一個線程執(zhí)行死循環(huán)有什么后果

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

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

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

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

示例代碼(代碼來源于互聯(lián)網(wǎng))

?
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;
      //在這里執(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)如下:

?
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執(zhí)行methodA(),methodA()中有一個死循環(huán)

?
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執(zhí)行methodB(),當(dāng)線程A進(jìn)入methodA()中的while死循環(huán)時,線程B的能不能執(zhí)行完成? 

測試類

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黄色成人在线 | 日韩精品一区二区三区在线播放 | 日本久久久久久久久久久久 | 蜜桃一区 | 亚洲综合视频在线观看 | 精品欧美乱码久久久久久 | 国产精品片aa在线观看 | a视频在线 | 日日做 | 午夜视频在线播放 | 欧美一级在线观看 | 亚洲日本韩国在线观看 | 国产韩国精品一区二区三区 | 91大片在线观看 | 亚洲精品乱码久久久久久金桔影视 | 久久精品一区二区 | 亚洲免费在线 | 91久久久久久久久 | 久久久久国产精品 | 亚洲自拍中文 | 国产精品尤物在线观看 | 亚洲精品久久久久久一区二区 | 国产精品久久久久久久久久久久| 成人免费在线电影 | 亚洲视频精品在线观看 | 日韩在线精品 | 精品久久一区二区三区 | 亚洲一区久久 | 亚洲一区在线日韩在线深爱 | 久久精品无码一区二区三区 | 精品国产久 | 国产 一区| 成人网在线观看 | 99久久国 | 伊人中文 | 夜夜爽99久久国产综合精品女不卡 | 99草在线视频 | 欧美精品一区二 | 色视在线| 国产欧美日韩成人 | 国产韩国精品一区二区三区 |