电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java并發工具輔助類代碼實例

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

java中的并發工具類

一:等待多線程完成的CountDownLatch

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

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

正確執行結果:

Java并發工具輔助類代碼實例

但是如果我們設置計數器的容量大于6的話(相對于我的程序而言),就會被阻塞在那里

Java并發工具輔助類代碼實例

會發現執行完成了 沒有被打印出來,而且程序一直沒有停止,這個時候就是因為計數器沒有歸0,所以當前線程被阻塞,不能向下面繼續進行。

二:同步屏障CyclicBarrier

CyclicBarrier的翻譯大致就是可循環的屏障。它主要的作用就是讓一組線程到達一個屏障(也可以叫做同步點)時被阻塞,直到最后一份線程到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續運行。

package com.fuzhulei;​import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;​/** * CyclicBarrier是一個加法計數器,即同步屏障,可循環的屏障,讓一組線程到達一個屏障(也可以叫做同步點)時被阻塞,直到最后一個線程到達屏障,達到了一開始初始化的屏障的數值, * 屏障才可以打開門,所有被攔截的線程才可以繼續工作,主要是通過調用await方法來實現的 * @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已經到達屏障'); },'A').start();​ new Thread(()->{ try {cyclicBarrier.await(); } catch (InterruptedException e) {e.printStackTrace(); } catch (BrokenBarrierException e) {e.printStackTrace(); } System.out.println('線程B已經到達屏障'); },'B').start();​ new Thread(()->{ try {cyclicBarrier.await(); } catch (InterruptedException e) {e.printStackTrace(); } catch (BrokenBarrierException e) {e.printStackTrace(); } System.out.println('線程C已經到達屏障'); },'C').start();​​ }}

執行的結果如下:

Java并發工具輔助類代碼實例

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

Java并發工具輔助類代碼實例

并且程序一直還沒有停止,這就是屏障起到了作用,因為屏障要求至少需要4個(假設),但是此時只有三個線程到達,所以不滿足,屏障就一直阻攔不放路,那么所有的線程也就被阻塞不能向下面繼續運行,除非知道第四個過來,滿足條件才會運行。

三:控制并發線程數的Semaphore

用來控制同時訪問特定資源的線程數量,通過協調各個線程,以保證合理的使用公用的資源。

package com.fuzhulei;​import java.util.concurrent.*;​/** * 用來控制同時訪問特定資源的線程數量,通過協調各個線程,以保證合理的使用公用的資源 * @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(); } }}

執行的結果如下:

Java并發工具輔助類代碼實例

例如:數據庫資源,假如需要讀取幾十萬個數據的文件,因為都是IO密集型任務,所以開了2倍的處理器+1個線程數(IO密集型,所以線程可以多一些,讓cpu忙起來,因為IO操作的時候,很少操作Cpu)

但是如果讀到內存后,還需要存儲到數據庫中,但是數據庫連接我們設置的加入就10個,所以我們必須控制只有10個線程可以同時訪問數據庫連接保存數據,否則會報錯無法連接數據庫異常。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 山东螺杆空压机,烟台空压机,烟台开山空压机-烟台开山机电设备有限公司 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 超声波清洗机-超声波清洗设备定制生产厂家 - 深圳市冠博科技实业有限公司 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | MVE振动电机_MVE震动电机_MVE卧式振打电机-河南新乡德诚生产厂家 | 废旧物资回收公司_广州废旧设备回收_报废设备物资回收-益美工厂设备回收公司 | 苏州教学设备-化工教学设备-环境工程教学模型|同科教仪 | 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 周口风机|周风风机|河南省周口通用风机厂 | R507制冷剂,R22/R152a制冷剂厂家-浙江瀚凯制冷科技有限公司 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | CCC验厂-家用电器|服务器CCC认证咨询-奥测世纪 | 心肺复苏模拟人|医学模型|急救护理模型|医学教学模型上海康人医学仪器设备有限公司 | 二氧化碳/活性炭投加系统,次氯酸钠发生器,紫外线消毒设备|广州新奥 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 阴离子_阳离子聚丙烯酰胺厂家_聚合氯化铝价格_水处理絮凝剂_巩义市江源净水材料有限公司 | 高压管道冲洗清洗机_液压剪叉式升降机平台厂家-林君机电 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 氟氨基酮、氯硝柳胺、2-氟苯甲酸、异香兰素-新晨化工 | 商标转让-商标注册-商标查询-软著专利服务平台 - 赣江万网 | 搪瓷搅拌器,搪玻璃搅拌器,搪玻璃冷凝器_厂家-淄博越宏化工设备 | 压滤机滤板_厢式_隔膜_板框压滤机滤板厂家价格型号材质-大凯环保 | 全国国际学校排名_国际学校招生入学及学费-学校大全网 | 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 电位器_轻触开关_USB连接器_广东精密龙电子科技有限公司 | 东莞喷砂机-喷砂机-喷砂机配件-喷砂器材-喷砂加工-东莞市协帆喷砂机械设备有限公司 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 飞飞影视_热门电影在线观看_影视大全 | 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | 股指期货-期货开户-交易手续费佣金加1分-保证金低-期货公司排名靠前-万利信息开户 | 卫生人才网-中国专业的医疗卫生医学人才网招聘网站! | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 蒸压釜-陶粒板隔墙板蒸压釜-山东鑫泰鑫智能装备有限公司 | 高低温老化试验机-步入式/低温恒温恒湿试验机-百科 | 数显恒温培养摇床-卧式/台式恒温培养摇床|朗越仪器 |