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

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解Java線程同步器CountDownLatch

詳解Java線程同步器CountDownLatch

2020-09-12 15:01java小新人 Java教程

這篇文章主要介紹了Java線程同步器CountDownLatch的相關資料,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下

  Java程序有的時候在主線程中會創建多個線程去執行任務,然后在主線程執行完畢之前,把所有線程的任務進行匯總,以前可以用線程的join方法,但是這個方法不夠靈活,我們可以使用CountDownLatch類,實現更優雅,而且使用線程池的話,可沒有辦法調用線程的join方法的呀!

一.簡單使用CountDownLatch

  直接使用線程:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.example.demo.study;
 
import java.util.concurrent.CountDownLatch;
 
public class Study0215 {
  //這里相當于新建一個初始值為2的計數器
  private static volatile CountDownLatch countDownLatch = new CountDownLatch(2);
  
  public static void main(String[] args) throws InterruptedException {
    
    new Thread(()->{
      try {
        Thread.sleep(1000);
        System.out.println("線程一執行完畢");
      } catch (Exception e) {
        
      }finally {
        //每調用這個方法計數器減一
        countDownLatch.countDown();
      }
      
    }).start();
    
    new Thread(()->{
      try {
        Thread.sleep(1000);
        System.out.println("線程二執行完畢");
      } catch (Exception e) {
        
      }finally {
        countDownLatch.countDown();
      }
      
    }).start();
    
    System.out.println("兩個線程已經全部啟動");
    //只要調用了這個方法之后,主線程會阻塞,直到計數器countDownLatch變成0就會返回
    countDownLatch.await();
    System.out.println("執行完畢");
    
  }
  
}

實際中盡量少直接操作線程,而是使用線程池:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.example.demo.study;
 
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class Study0215 {
  // 這里相當于新建一個初始值為2的計數器
  private static volatile CountDownLatch countDownLatch = new CountDownLatch(2);
 
  public static void main(String[] args) throws InterruptedException {
    //創建線程池
    ExecutorService pool = Executors.newFixedThreadPool(2);
    //將任務一丟進線程池
    pool.submit(() -> {
      try {
        Thread.sleep(1000);
        System.out.println("線程一執行完畢");
      } catch (Exception e) {
 
      } finally {
        // 每調用這個方法計數器減一
        countDownLatch.countDown();
      }
    });
    //任務二丟進線程池
    pool.submit(() -> {
      try {
        Thread.sleep(1000);
        System.out.println("線程二執行完畢");
      } catch (Exception e) {
 
      } finally {
        countDownLatch.countDown();
      }
    });
 
    System.out.println("兩個線程已經全部啟動");
    // 只要調用了這個方法之后,主線程會阻塞,直到計數器countDownLatch變成0就會返回
    countDownLatch.await();
    System.out.println("執行完畢");
 
  }
 
}

二.await方法

  看下面的圖,可以知道這個CountDownLatch類內部有個工具類Sync實現了AQS,然后CountDownLatch中的方法都是調用工具類Sync去操作的,emmm....跟前面說過的ReentrantLock類結構是一樣的;

詳解Java線程同步器CountDownLatch

我們看看CountDownLatch構造器傳遞的數其實就是設置AQS中state的值:

?
1
2
3
4
5
6
7
8
//實際上調用把值傳遞給了Sync,也就是設置了AQS中的state
public CountDownLatch(int count) {
  if (count < 0) throw new IllegalArgumentException("count < 0");
  this.sync = new Sync(count);
}
Sync(int count) {
  setState(count);
}

我們再看看await方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//當前線程調用了await方法之后,當前線程就會給阻塞,直到以下兩種情況:
//1.其他線程調用了countDown方法將計數器減到0之后,該線程就返回了;
//2.其他線程調用了當前的線程的中斷方法,當前線程拋出異常InterruptedException
public void await() throws InterruptedException {
  sync.acquireSharedInterruptibly(1);
}
 
public final void acquireSharedInterruptibly(int arg) throws InterruptedException {
  //當前線程被中斷就拋出異常
  if (Thread.interrupted())
    throw new InterruptedException();
  //查看計數器中的值是不是0,不過不是0,就進入AQS等待隊列等待;
  if (tryAcquireShared(arg) < 0)
    doAcquireSharedInterruptibly(arg);
}
 
protected int tryAcquireShared(int acquires) {
  return (getState() == 0) ? 1 : -1;
}

三.countDown方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void countDown() {
  sync.releaseShared(1);
}
 
public final boolean releaseShared(int arg) {
  //tryReleaseShared方法返回false,說明當前計數器的值減一成功
  //返回true,說明計數器的值此時為0,那就要喚醒因為調用了CountDownLatch而阻塞的線程
  if (tryReleaseShared(arg)) {
    doReleaseShared();
    return true;
  }
  return false;
}
 
protected boolean tryReleaseShared(int releases) {
  //一個無限循環
  for (;;) {
    //獲取state的值
    int c = getState();
    //如果state為0,返回false
    if (c == 0)
      return false;
    //否則就把state減一然后用CAS更新到state
    int nextc = c-1;
    if (compareAndSetState(c, nextc))
      return nextc == 0;
  }
}

四.getState方法

  這個方法獲取計數器的值,其實就是獲取AQS中的state的值;

?
1
2
3
4
5
6
int getCount() {
  return getState();
}
protected final int getState() {
  return state;
}

  其實CountDownLatch比較容易,功能和Thread的join方法一樣,只不過更靈活,基于AQS實現,在初始化的時候設置state的值,當線程調用CountDownLatch的await方法的時候,當前線程就會被丟到AQS的阻塞隊列掛起;然后當其他線程調用了countDown方法,其實就是將state減一,當state等于0的時候,就會喚醒所有因為調用await方法而阻塞的線程;

以上就是詳解Java線程同步器CountDownLatch的詳細內容,更多關于Java CountDownLatch的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/wyq1995/p/12315072.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 蜜桃一二三区 | 亚洲va中文字幕 | 久久精品国产99国产精品 | 久久亚洲国产精品 | 91社区福利 | 一区二区视频 | 看a网站| 免费视频爱爱太爽了 | 日本精品久久久 | 久久一区二 | 91精品国产一区二区三区 | 久久首页| 中文字幕在线免费视频 | 欧美精品欧美极品欧美激情 | 在线免费观看av电影 | 久久精品日产第一区二区三区 | 久久男人天堂 | 国产一区二区三区视频在线观看 | 久草中文在线 | 国产视频第一页 | 免费一区| 欧美在线视频a | 中文字幕一区二区在线观看 | 精品久久久久久久久久久久 | 黄色在线 | 日韩中文一区二区三区 | 91在线看| 中文字幕视频免费 | 六月婷操 | 成人黄网视频在线观看 | 亚洲激情在线播放 | 久久国产精品一区二区三区 | 亚洲成人黄色 | 亚洲狠狠爱 | 成人福利网 | aaa视频网站| 久久国产精品一区二区 | 久久av网| 中文字幕一区二区三区精彩视频 | 不卡视频一区二区 | 成人在线免费电影 |