1. 程式人生 > >CountDownLatch--控制三個執行緒執行順序(三)

CountDownLatch--控制三個執行緒執行順序(三)

前言

執行緒中run方法呼叫CountDownLatch。CountDownLatch的兩個核心方法:

  • countObj.countDown() 表示countObj計數減少。
  • countObj.await() 表示檢查countObj若不為0則阻塞,為0,則允許執行。

比較

join

join的工作原理是(原始碼),不停檢查thread是否存活,如果存活則讓當前執行緒永遠wait,直到thread執行緒終止,執行緒的this.notifyAll 就會被呼叫。

CountDownLatch

檢查計數器是否為0,如果不為0則讓當前執行緒永遠wait,直到thread執行緒中的計數器為0,執行緒的this.notifyAll 就會被呼叫。

方式1: 用join實現三個執行緒有序執行

public static void main(String[] args) {  

   final Thread t1=new Thread(new Runnable(){        
        @Override
        public void run() {
              System.out.println("t1");         
        }
   });

  final Thread t2 = new Thread(new Runnable() {     
        @Override
public void run() { try{ t1.join(); }catch(InterruptedException e){ } System.out.println("t2"); } }); final Thread t3=new Thread(new Runnable(){ @Override public void run() { try { t2.join(); } catch
(InterruptedException e) { e.printStackTrace(); } System.out.println("t3"); } }); t1.start(); t2.start(); t3.start(); }

方式2: 用CountDownLatch實現三個執行緒有序執行

建立執行緒類的時候,將上一個計數器和本執行緒計數器傳入。執行前業務執行上一個計數器.await,執行後本計數器.countDown。

public class CountLatchDown3 {

    public static void main(String[] args) {    
        CountDownLatch c0 = new CountDownLatch(0); //①
        CountDownLatch c1 = new CountDownLatch(1); //②
        CountDownLatch c2 = new CountDownLatch(1); //③

        Thread t1 = new Thread(new Work(c0, c1));
        //c0為0,t1可以執行。t1的計數器減1

        Thread t2 = new Thread(new Work(c1, c2));
        //t1的計數器為0時,t2才能執行。t2的計數器c2減1

        Thread t3 = new Thread(new Work(c2, c2));
        //t2的計數器c2為0時,t3才能執行

        t2.start();
        t1.start();
        t3.start();

    }
    //定義Work執行緒類,需要傳入開始和結束的CountDownLatch引數
    static class Work implements Runnable {
        CountDownLatch c1;
        CountDownLatch c2;
        Work(CountDownLatch c1, CountDownLatch c2){
            super();
            this.c1=c1;
            this.c2=c2;
        }
        public void run() {
            try {
                c1.await();//前一執行緒為0才可以執行
                System.out.println("開始執行執行緒:"+ Thread.currentThread().getName());
                c2.countDown();//本執行緒計數器減少
            } catch (InterruptedException e) {              
            }  

        }
    }

}

效果:

開始執行執行緒:Thread-0
開始執行執行緒:Thread-1
開始執行執行緒:Thread-2

注:將上述程式碼①②③處全部寫CountDownLatch(0),則不會造成執行緒阻塞。會有如下隨機結果:

開始執行執行緒:Thread-1
開始執行執行緒:Thread-0
開始執行執行緒:Thread-2

相關推薦

執行同步工具控制併發訪問多資源

宣告:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 譯者:鄭玉婷 控制併發訪問多個資源 在併發訪問資源的控制中,你學習了訊號量(semaphores)的基本知識。 在上個指南,你實現了使用binar

執行同步工具等待多併發事件完成

宣告:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 譯者:鄭玉婷 等待多個併發事件完成 Java併發API提供這樣的類,它允許1個或者多個執行緒一直等待,直到一組操作執行完成。 這個類就是Count

執行和併發使用join方法讓執行順序執行

一.執行緒的join方法作用 join方法把指定的執行緒新增到當前執行緒中,可以不給引數直接thread.join(),也可以給一個時間引數,單位為毫秒thread.join(500)。事實上join方法是通過wait方法來實現的。比如執行緒A中加入了執行緒B.join方法

Java——多執行基本使用 餓漢式和懶漢式的單例設計模式,多執行之間的通訊

這一則部落格主要寫的是單例設計模式,與實現多執行緒之間的通訊等等~ 1.單例設計模式:保證類在記憶體中只有一個物件 2.保證類在記憶體中只有一個物件            &

Java面向物件與多執行綜合實驗之輸入輸出流

瞭解Java中I/O流的概念和種類;掌握位元組流處理和字元流處理,包括File類,InputStream/OutputStream及其子類,Reader/Writer及其子類;熟練掌握檔案的順序處理,隨機訪問處理;熟悉物件序列化的概念和方法。 編寫程式,實現檔案管理系統中的檔案上傳/下載模組

執行那些事

這篇文章主要是用簡單的程式碼展示自己在梳理和複習多執行緒的過程中的一些問題,歡迎大家指正; 關鍵字volatile /** * @program: demo * @description: ${description} * @author: Will Wu * @create: 2

Java多執行之AQSAbstractQueuedSynchronizer 實現原理和原始碼分析

章節概覽、 1、回顧 上一章節,我們分析了ReentrantLock的原始碼: 2、AQS 佇列同步器概述 本章節我們深入分析下AQS(AbstractQueuedSynchronizer)佇列同步器原始碼,AQS是用來構建鎖或者其他同步元件的基礎框架。

執行同步工具控制併發階段性任務的改變

宣告:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 譯者:鄭玉婷 控制併發階段性任務的改變 Phaser 類提供每次phaser改變階段都會執行的方法。它是 onAdvance() 方法。它接收2個

執行同步工具控制併發訪問資源

宣告:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 譯者:鄭玉婷     控制併發訪問資源 這個指南,你將學習怎樣使用Java語言提供的Semaphore機制。Semaphore是一個控制訪問多個共享

章-執行同步工具引言

宣告:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 譯者:鄭玉婷 3 執行緒同步工具 章節提要: 併發地訪問資源的控制 併發地訪問多個副本資源的控制 等待多個併發事件 在一個相同點同步任務 併發的階

Java多執行與併發

Condition等待和喚醒 在我們的並行程式中,避免不了某些寫成要預先規定好的順序執行,例如:先新增後修改,先買後賣,先進後出,對於這些場景,使用JUC的Conditon物件再合適不過了。 JUC中提供了Condition物件,用於讓指定執行緒等待與喚

java執行深度解析——併發模型Future

Main:啟動系統,呼叫Client發出請求; Client:返回Data物件,理解返回FutureData,並開啟ClientThread執行緒裝配RealData; Data:返回資料的介面; FutureData:Future資料,構造很快,但是是一個虛擬的資料,需要裝配RealData; RealD

執行鎖的本質:執行控制執行狀態控制 while if:根據執行的關係模式協調執行執行

執行緒鎖的本質:執行緒控制、執行緒狀態控制 while if https://www.cnblogs.com/feng9exe/p/8319000.html https://www.cnblogs.com/feng9exe/p/8799312.html https://www.cnblogs.com/f

執行學習筆記之單例模式中的執行問題

在某些情況下,每個類只需要一個例項,單例模式就是保證在整個應用程式的生命週期中,任何一個時刻,單例類的例項都只存在一個(當然也可以不存在),核心點: 將採用單例模式的類的構造方法私有化(private修飾) 在其內部產生該類的例項化物件,並將其封裝成priv

JAVA多執行學習心得

今天看了併發實踐這本書的ReentantLock這章,感覺對ReentantLock還是不夠熟悉,有許多疑問,所有在網上找了很多文章看了一下,總體說的不夠詳細,重點和焦點問題沒有談到,但這篇文章相當不錯,說的很全面,主要的重點都說到了,所有在這裡轉載了這篇文章,注意紅色字

安卓開發之多執行斷點下載

效果圖: Log: 網上關於講解挺多的,我這裡不講解了,不懂的可以評論留言,從問題中解決問題 我可以說一下我解決問題的方式,將複雜問題劃分成多個簡單的問題 多執行緒下載一:請點選這裡 多執行緒下載二:請點選這裡 許可權: <uses

java多執行--公平鎖

獲取公平鎖(基於JDK1.7.0_40) 通過前面“”的“示例1”,我們知道,獲取鎖是通過lock()函式。下面,我們以lock()對獲取公平鎖的過程進行展開。 1. lock() lock()在ReentrantLock.java的FairSync類中實現,它的原始碼如下

JAVA 併發程式設計-傳統執行互斥技術Synchronized

    java執行緒互斥是為了保證,同一時刻最多隻有一個執行緒執行該段程式碼。那麼它的出現又是為了解決什麼問題呢?賬戶存取款,在同一時間段只能讓一個人進行操作。下面來看一個簡單例項(多執行緒帶來的問題

執行詳解

多執行緒詳解(二) 在正式介紹執行緒建立的第二種方法之前,我們接著多執行緒詳解(一),講一下:對執行緒的記憶體圖、執行緒的狀態,為下面的學習打下基礎,小夥伴們不要急喲!! 一、多執行緒執行的記憶體圖(ps.博主沒有找到合適的畫圖工具,歡迎大神們貢獻啊) class pers

執行詳解

[多執行緒詳解(一)](http://www.neilx.com) 一、概念準備 1、程序 (1)直譯:正在進行中的程式 (2)解釋:執行一個程式時,會在記憶體中為程式開闢空間,這個空間就是一個程序。 (3)注意:一個程序中不可能沒有執行緒,只有有了執行緒才能執行; 程序只