亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java并發(fā)工具輔助類(lèi)代碼實(shí)例

瀏覽:4日期:2022-09-02 17:26:53

java中的并發(fā)工具類(lèi)

一:等待多線程完成的CountDownLatch

CountDownLatch允許一個(gè)或多個(gè)線程等待其他線程完成操作。

package com.fuzhulei;import java.util.concurrent.*;​/** * 減法計(jì)數(shù)器,主要是countDown(計(jì)數(shù)器1) 和 await(阻塞)方法,只有當(dāng)計(jì)數(shù)器減為0的時(shí)候,當(dāng)前線程才可以往下繼續(xù)執(zhí)行。 * 主要用于允許一個(gè)或多個(gè)線程等待其他線程完成操作 * @author Huxudong * @createTime 2020-04-05 00:04:36 **/public class CountDownDemo { public static void main(String[] args) throws InterruptedException { /** 使用其構(gòu)造函數(shù),創(chuàng)建一個(gè)數(shù)值為6的計(jì)數(shù)器 */ CountDownLatch countDownLatch = new CountDownLatch(6); /** 自定義線程池使用 */ ExecutorService pool = new ThreadPoolExecutor(6, // 核心線程池大小9, // 最大線程池的大小(根據(jù)是IO密集型,還是CPU密集型來(lái)確定大小)3L, // 超時(shí)等待時(shí)間TimeUnit.SECONDS, // 時(shí)間的單位new LinkedBlockingQueue<>(5), // 阻塞隊(duì)列是哪一種Executors.defaultThreadFactory(), // 默認(rèn)線程創(chuàng)建工廠new ThreadPoolExecutor.AbortPolicy() // 四大拒絕策略,選擇一種 ); try{ for (int i = 0; i < 6; i++) {/** 這個(gè)線程的提交,沒(méi)有返回值的任務(wù) */pool.execute(()->{ countDownLatch.countDown(); System.out.println(Thread.currentThread().getName()+'執(zhí)行一次減法');});​ } } catch(Exception e) { e.printStackTrace(); } finally { /** 關(guān)閉線程池 */ pool.shutdown(); }​ countDownLatch.await(); System.out.println('執(zhí)行完成了');​ }}

正確執(zhí)行結(jié)果:

Java并發(fā)工具輔助類(lèi)代碼實(shí)例

但是如果我們?cè)O(shè)置計(jì)數(shù)器的容量大于6的話(相對(duì)于我的程序而言),就會(huì)被阻塞在那里

Java并發(fā)工具輔助類(lèi)代碼實(shí)例

會(huì)發(fā)現(xiàn)執(zhí)行完成了 沒(méi)有被打印出來(lái),而且程序一直沒(méi)有停止,這個(gè)時(shí)候就是因?yàn)橛?jì)數(shù)器沒(méi)有歸0,所以當(dāng)前線程被阻塞,不能向下面繼續(xù)進(jìn)行。

二:同步屏障CyclicBarrier

CyclicBarrier的翻譯大致就是可循環(huán)的屏障。它主要的作用就是讓一組線程到達(dá)一個(gè)屏障(也可以叫做同步點(diǎn))時(shí)被阻塞,直到最后一份線程到達(dá)屏障時(shí),屏障才會(huì)開(kāi)門(mén),所有被屏障攔截的線程才會(huì)繼續(xù)運(yùn)行。

package com.fuzhulei;​import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;​/** * CyclicBarrier是一個(gè)加法計(jì)數(shù)器,即同步屏障,可循環(huán)的屏障,讓一組線程到達(dá)一個(gè)屏障(也可以叫做同步點(diǎn))時(shí)被阻塞,直到最后一個(gè)線程到達(dá)屏障,達(dá)到了一開(kāi)始初始化的屏障的數(shù)值, * 屏障才可以打開(kāi)門(mén),所有被攔截的線程才可以繼續(xù)工作,主要是通過(guò)調(diào)用await方法來(lái)實(shí)現(xiàn)的 * @author Huxudong * @createTime 2020-04-04 22:53:50 **/public class CyclicBarrierDemo { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(3); new Thread(()->{​ try {cyclicBarrier.await(); } catch (InterruptedException e) {e.printStackTrace(); } catch (BrokenBarrierException e) {e.printStackTrace(); } System.out.println('線程A已經(jīng)到達(dá)屏障'); },'A').start();​ new Thread(()->{ try {cyclicBarrier.await(); } catch (InterruptedException e) {e.printStackTrace(); } catch (BrokenBarrierException e) {e.printStackTrace(); } System.out.println('線程B已經(jīng)到達(dá)屏障'); },'B').start();​ new Thread(()->{ try {cyclicBarrier.await(); } catch (InterruptedException e) {e.printStackTrace(); } catch (BrokenBarrierException e) {e.printStackTrace(); } System.out.println('線程C已經(jīng)到達(dá)屏障'); },'C').start();​​ }}

執(zhí)行的結(jié)果如下:

Java并發(fā)工具輔助類(lèi)代碼實(shí)例

但是如果把定義的容量大于3(相對(duì)于我的程序而言),就會(huì)發(fā)現(xiàn)什么都不會(huì)輸出了,看截圖

Java并發(fā)工具輔助類(lèi)代碼實(shí)例

并且程序一直還沒(méi)有停止,這就是屏障起到了作用,因?yàn)槠琳弦笾辽傩枰?個(gè)(假設(shè)),但是此時(shí)只有三個(gè)線程到達(dá),所以不滿足,屏障就一直阻攔不放路,那么所有的線程也就被阻塞不能向下面繼續(xù)運(yùn)行,除非知道第四個(gè)過(guò)來(lái),滿足條件才會(huì)運(yùn)行。

三:控制并發(fā)線程數(shù)的Semaphore

用來(lái)控制同時(shí)訪問(wèn)特定資源的線程數(shù)量,通過(guò)協(xié)調(diào)各個(gè)線程,以保證合理的使用公用的資源。

package com.fuzhulei;​import java.util.concurrent.*;​/** * 用來(lái)控制同時(shí)訪問(wèn)特定資源的線程數(shù)量,通過(guò)協(xié)調(diào)各個(gè)線程,以保證合理的使用公用的資源 * @author Huxudong * @createTime 2020-04-04 23:45:29 **/public class SemaphoreDemo { public static void main(String[] args) { Semaphore semaphore = new Semaphore(5); ExecutorService pool = new ThreadPoolExecutor(10,20,3L,TimeUnit.SECONDS,new LinkedBlockingQueue<>(20),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());​ try{ for (int i = 0; i < 60; i++) {pool.execute(() ->{ try { semaphore.acquire(); System.out.println(Thread.currentThread().getName()+'限流成功'); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); }}); } } catch(Exception e) { e.printStackTrace(); } finally { pool.shutdown(); } }}

執(zhí)行的結(jié)果如下:

Java并發(fā)工具輔助類(lèi)代碼實(shí)例

例如:數(shù)據(jù)庫(kù)資源,假如需要讀取幾十萬(wàn)個(gè)數(shù)據(jù)的文件,因?yàn)槎际荌O密集型任務(wù),所以開(kāi)了2倍的處理器+1個(gè)線程數(shù)(IO密集型,所以線程可以多一些,讓cpu忙起來(lái),因?yàn)镮O操作的時(shí)候,很少操作Cpu)

但是如果讀到內(nèi)存后,還需要存儲(chǔ)到數(shù)據(jù)庫(kù)中,但是數(shù)據(jù)庫(kù)連接我們?cè)O(shè)置的加入就10個(gè),所以我們必須控制只有10個(gè)線程可以同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)連接保存數(shù)據(jù),否則會(huì)報(bào)錯(cuò)無(wú)法連接數(shù)據(jù)庫(kù)異常。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 韩国 欧美 日产 国产精品 | 俺去啦网婷婷 | 久久黄色免费 | 性做爰片视频毛片 | 亚洲欧洲中文日产 | 国产精品免费综合一区视频 | 激情欧美成人狠狠色金八天国 | 伊人久久在线视频 | 亚洲精品永久www嫩草 | 国产在线观看美女福利精 | 亚洲专区区免费 | 日韩精品亚洲专区在线影视 | 午夜骚影 | 天天色亚洲 | 国产91久久最新观看地址 | 综合久草 | 午夜视频污 | 国内国语一级毛片在线视频 | 一区在线免费观看 | 国产成+人+综合+亚洲 欧美 | 黄色三级视频在线观看 | 91网视频在线观看 | 亚洲日韩色综合视频 | 国产成人久久久精品一区二区三区 | 国产2区 | 日韩欧美中文字幕在线视频 | 青青国产成人久久91 | 国产h视频在线观看高清 | 日韩欧美在线第一页 | 114级毛片免费观看 123456成年免费视频 | 精品三区 | 国产1区2区3区 | 日本a黄色片 | 大伊香蕉在线精品不卡视频 | 午夜性刺激片免费观看成人 | 国产午夜在线观看视频 | 特级欧美午夜aa毛片 | 91久久精品午夜一区二区 | 久久国产三级 | 国产精品黄网站免费观看 | 激情动态视频 |