項目實踐,使用Cyclic Barrier在多線程中設置屏障

2021-01-11 Java技術匯

柵欄類似於閉鎖,它能阻塞一組線程直到某個事件的發生。柵欄與閉鎖的關鍵區別在於,所有的線程必須同時到達柵欄位置,才能繼續執行。閉鎖用於等待事件,而柵欄用於等待其他線程。

Cyclic Barrer也可以用於解決多個線程之間的相互等待問題。Cyclic Barrier的使用場景是, 每個線程在執行時, 都會碰到屏障, 該屏障會攔截所有線程的執行(通過await() 方法實現) ;當指定數量的線程全部就位時,所有的線程再跨過屏障同時執行。

現舉例說明CountDown Latch和Cyclic Barrier的區別。假設有A、B、C 3個線程, 其中C是最後一個加人的線程。(1) 使用CountDown Latch, 可以實現當A和B全部執行完畢後, C再去執行。(2) 使用Cyclic Barrier,可以實現A、B等到C就緒後(await O) 表示就緒) , A、B、C三者再同時去執行。範例4-7線程屏障3個人去開會,只有當3個人都抵達之後,會議才開始。換句話說,當最後一個人抵達後,會議就開始。

代碼如下:

package com.highcon.thread;

import java.io.IOException;

import java.util.concurrent.BrokenBarrierException;

import java.util.concurrent.CyclicBarrier;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class TestCyclicBarrier {

static class MyThread implements Runnable {

//用於控制會議開始的屏障

private CyclicBarrier barrier;

//參會人員

private String person;

public MyThread(CyclicBarrier barrier, String name) {

this.barrier = barrier;

this.person = name;

}

public void run() {

try {

Thread.sleep((int) (10000 * Math.random()));

System.out.println(person + " 已經到會...");

barrier.await();

} catch (InterruptedException e) {

e.printStackTrace();

} catch (BrokenBarrierException e) {

e.printStackTrace();

}

System.out.println(person + " 開始會議...");

}

}

public static void main(String[] args) throws IOException, InterruptedException {

//將屏障設置為3,即當有3個線程執行到await()時,再同時釋放

CyclicBarrier barrier = new CyclicBarrier(3);

ExecutorService executor = Executors.newFixedThreadPool(3);

//三個人去開會

executor.submit(new MyThread(barrier, "zs"));

executor.submit(new MyThread(barrier, "ls"));

executor.submit(new MyThread(barrier, "ww"));

executor.shutdown();

}

}

運行結果如下圖:

相關焦點

  • Java項目實踐,CountDownLatch實現多線程閉鎖
    摘要本文主要介紹Java多線程並發中閉鎖(Latch)的基本概念、原理、示例代碼、應用場景,通過學習,可以掌握多線程並發時閉鎖(Latch)的使用方法。概念「閉鎖」就是指一個被鎖住了的門將線程a擋在了門外(等待執行),只有當門打開後(其他線程執行完畢),門上的鎖才會被打開,a才能夠繼續執行。
  • linux多線程之線程資源的釋放
    因此,在使用清理函數的時候,都應該暫時設置成PTHREAD_CANCEL_DEFERRED模式。為此,POSIX的Linux實現中還提供了一對不保證可移植的pthread_cleanup_push_defer_np()/pthread_cleanup_pop_defer_np()擴展函數,功能與以下代碼段相當:{ int oldtype;pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
  • 神經生物學名詞-blood-brain barrier
    新東方網>英語>英語學習>行業英語>醫療英語>正文神經生物學名詞-blood-brain barrier 2012-10-24 21:41 來源:外語教育網 作者:
  • 「軟帝學院」Java挑戰者專欄:多線程詳解2
    軟帝學院筆記Day21多線程(單例設計模式)(掌握)單例設計模式:保證類在內存中只有一個對象。如何保證類在內存中只有一個對象呢?多線程的問題?signal()方法不同的線程使用不同的Condition, 這樣就能區分喚醒的時候找哪個線程了多線程(線程組的概述和使用)(了解)A:線程組概述線程組的使用
  • 溫州市直立聲屏障生產廠家使用中的實際效果
    溫州市直立聲屏障生產廠家使用中的實際效果 ,「g9e2cn6mf」溫州市直立聲屏障生產廠家使用中的實際效果材質:低碳鋼板、鍍鋅板、彩塗鋼板、鋁鎂合金板、不鏽鋼板。它們的生產工藝不同,圓絲的是擠出,扁絲的是一個完整的片狀的網切割成一個個小的,再經過織造而成。擋風板後面出現分離和附著兩種現象。
  • 中文解讀 | 基底膜在血腦屏障發育及維護屏障功能中的作用
    基礎研究主要方向為血腦屏障體外模型的建立與功能評價。血腦屏障(Blood-Brain Barrier, BBB)作為中樞神經系統內一個獨特的生理結構,具有物質屏障、電屏障、免疫屏障等功能,將腦置於一個密閉、穩定、安全的系統中,但同時也限制了治療藥物的作用。腦微血管內皮細胞、周細胞、星形膠質細胞、基底膜共同構成了血腦屏障,對於血腦屏障中的細胞組分 —— 腦微血管內皮細胞間的緊密連接等研究相對比較集中且為大家所熟知。
  • 多線程面試和進階必備-任務同步最常用的十種鎖的原理
    i++是線程不安全的,它的操作包括從內存中獲取一個值,給該值遞增1,再將它存回內存。這些操作可能被線程調度器打斷。Interlocked類提供了以線程安全的方式遞增、遞減、交換和讀取值的方式。與其他的同步技術相比,使用功能Interlocked類會快得多,但是僅用於簡單的任務同步。Monitor類。與Lock語句相比,Monitor類可以添加一個等待被鎖定的超時值。
  • 巨噬細胞為關節提供保護屏障
    他們發現滑膜組織中具有自我更新能力的巨噬細胞為關節提供了保護屏障。 相關論文發表於2019年8月29日出版的《自然》雜誌。 研究人員使用fate-mapping結合三維雷射片層掃描顯微鏡和單細胞RNA測序的方法,對健康人以及關節炎病人體內巨噬細胞亞群的組成、起源和分化進行全面的時空分析,並研究這些巨噬細胞在關節炎中的作用。
  • PyTorch中使用DistributedDataParallel進行多GPU分布式模型訓練
    請注意,此代碼僅適用於在一臺多GPU機器上進行訓練! 同一臺機器用於啟動作業中的每個流程,因此訓練只能利用連接到該特定機器的GPU。 這使事情變得容易:設置IPC就像在localhost上找到一個空閒埠一樣容易,該埠對於該計算機上的所有進程都是立即可見的。 跨計算機的IPC更為複雜,因為它需要配置一個對所有計算機可見的外部IP位址。
  • 如何在vue項目中使用sass並設置元素樣式
    ,可以使用CSS3定義元素樣式;還可以使用sass動態變量定義元素樣式。如果直接使用sass,啟動項目會出現報錯。那麼,如何在vue項目中使用sass?npm i element-ui -S,安裝element4、打開項目中的main.js文件,導入element相關的模塊和樣式文件,然後使用Vue.use(ElementUI)
  • 鶴壁市聲屏障廠家在日常生活中重要性
    立異實踐是企業促進企業展的中心競爭力。在特別查看期間應堅持記載,並堅持記載無缺。高速公路聲屏障降低噪音有三個方面,一是吸收噪音,就是利用高速公路聲屏障內的吸音材料將噪音吸收掉,係數的大小與材料的好壞有直接關係,我們專業聲屏障廠家採用非常優質的玻璃棉作為吸音材料進行填充,當聲波進入聲屏障面板時,玻璃棉利用其多孔洞的特點使聲音在其內傳播時逐漸消耗掉。
  • 日照市空調機組聲屏障廠家的使用指南
    偽劣材表面易發作裂紋,緣由是它的坯料是土坯,土坯氣孔多,土坯在冷卻的過程中由於遭到熱應力的效果,發作裂縫,通過軋制後就有裂紋。立柱的作用是保證聲屏障安裝及形成屏障牆體的主要支撐結構。每一個高速公路鋁合金隔聲屏障工程的實施之前,都要對其規格進行確定,保證降噪,並且也要考慮適應周圍環境等因素。先將紙設計的原材料經監理檢驗,符合設計要求後才可進廠工。讓糟糕的煤場環境得到了改善,讓清的空氣不在是一種奢求。
  • 微軟MR技術專家分享:AR/VR多線程處理的八年經驗與技巧
    原標題:微軟MR技術專家分享:AR/VR多線程處理的八年經驗與技巧  (映維網 2020年11月17日)多線程(Multithreading)是指從軟體或者硬體實現多個線程並發執行的技術。具有多線程能力的計算機因有硬體支持而能夠在同一時間執行多於一個線程,進而提升整體處理性能。
  • 液-液相分離促進形成皮膚屏障
    液-液相分離促進形成皮膚屏障 作者:小柯機器人 發布時間:2020/3/23 13:21:59 在近日,美國洛克菲勒大學Elaine Fuchs及其課題組的最新研究發現液-液相分離促進皮膚屏障的形成
  • 優雅終止線程?系統內存佔用較高?
    Velocity之OOMVelocity的基本使用Velocity模板語言的基本使用代碼如下:1. 初始化模板引擎2. 獲取模板文件3. 設置變量4.在修改上面提到OOM那個bug並通過測試後,測試同學發現我們的作業無法停止下來,換句話說,我們作業所在的java線程無法停止。線程停止失敗重現一番debug與代碼深入研讀之後,發現我們項目中確實是調用了對應的線程對象的interrupt方法thread.interrupt();去終止線程的。
  • Linux多線程編程和Linux 2.6下的NPTL
    這幾天由於工作需要,琢磨了一下Linux下的多線程的相關資料。Linux下最常用的多線程支持庫為 Pthread庫,它是glibc庫的組成部分。但是關於Pthread的說明文檔非常缺乏,特別是對POSIX多線程規範的介紹以及pthread庫中多線程實現方式的介紹實在是少之又少。而多線程編程對於系統程式設計師而言是必須掌握的技術,因此總是讓學習中的程式設計師覺得頭痛不以。
  • 進程和線程常見的19個問題
    可以從兩個方面重新理解進程:從資源組合的角度:進程把一組相關的資源組合起來,構成一個資源平臺環境,包括地址空間(代碼段、數據段),打開的文件等各種資源從運行的角度:代碼在這個資源平臺上的執行流程,然而線程貌似也是這樣,但是進程比線程多了資源內容列表樣式:那就有一個公式:進程 = 線程 + 共享資源15為什麼使用線程?
  • 大分子突破血腦屏障,科學家們取得重要進展
    論文中,這家生物技術公司介紹了一種全新的技術,能幫助大分子突破血腦屏障,進入大腦。這也意味著在40多年的不斷嘗試下,我們終於取得了可喜的進展。 基於這些發現,當時的科學家們推斷,在中樞神經系統和身體的其他部位之間,存在某種神秘的屏障,阻止了物質的自由流通。起初,人們以為屏障效應是血管造成的。而如今我們知道,血腦屏障由緊密相連的內皮細胞組成。 由於血腦屏障的存在,很多生物大分子無法從血液循環中進入大腦,從而限制了許多藥物的使用——如果它們無法進入大腦,自然也就無法治療大腦裡的疾病。
  • 你未必真的了解線程安全,別騙自己,來看下怎麼實現線程安全
    電腦中時會有很多單獨運行的程序,每個程序有一個獨立的進程,而進程之間是相互獨立存在的。比如下圖中的QQ、酷狗播放器、電腦管家等等。什麼是線程?進程想要執行任務就需要依賴線程。換句話說,就是進程中的最小執行單位就是線程,並且一個進程中至少有一個線程。