Java并发编程(您不知道的线程池操作),最受欢迎的8位Java大师,Java并发包中的同步队列SynchronousQueue实现原理xxxxxxxx1x2xxxxxxx

Exchanger可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给exchange方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger可能被视为SynchronousQueue的双向形式。Exchanger可能在应用程序(比如遗传算法和管道设计)中很有用。

基本想法是维护一个槽指向一个结点,结点包含一个准备提供(出去)的item和一个等待填充的洞。如果一个到来的“occupying”线程看到槽是空的,CAS结点到那里并等待另一个线程发起交换。第二个“fulfilling”线程看到槽是非空的,把它CAS回空,也通过CAS洞交换item,加上唤醒occupying线程,如果它是阻塞的。在每种情况下CAS可能失败,因为一个槽一开始看起来是非空的,但在CAS时不是,或者相反,所以线程需要重试这些动作。

这个简单方法在只有少量线程使用Exchanger时工作得很好,当大量线程使用单个Exchanger时性能快速恶化,由于CAS竞争。因此我们使用一个“arena,竞技场”,基本上是一个哈希表,有动态可变数量的槽,每一个槽都可被任意线程执行交换。进入线程基于自己的线程ID选择槽,如果一个进入在它自己选择的槽上CAS失败,它选择一个供替代的槽。如果一个线程成功CAS到一个槽但没有其他线程到达,它尝试其他,前往0号槽,那里总是存在如果表收缩的话。控制这个的特殊机制如下:

根据算法描述里的一部分,做了个简单的实现。未测试。

此方法用于定位线程的默认槽。

此方法用于自旋等待,主要是默认槽是非0号槽的线程在没有线程可交换时使用。

doExchange方法是Exchanger类的核心方法,所以exchange方法极其变形最终都是调用这个方法。它的实现完全遵循前面的算法描述。

而对于java中的线程池,大家需要理解好ThreadPoolExecutor、AbstractExecutorService、ExecutorService和Executor这几个类之间的关系即可。

通过看上面的这个关系图,可以知道,最核心的一个类是ThreadPoolExecutor,我们下面来具体的看一下这个类的操作。

ThreadPoolExecutor类提供了四个构造函数,如下所示

下面来分析下这四个构造函数中每个参数的具体意义,其实主要是一些初始化的操作

corePoolSize:表明这个线程池的大小

maximumPoolSize:表明这个线程池中,最多可以容纳多少个线程执行

workQueue:阻塞队列,表示如何线程多余线程池的话,用来存储等待执行的任务,具体值如下

1)ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小;

2)LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE;

3)synchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务。

threadFactory:一个线程工厂,用来创建线程

handler:用来表示拒绝执行任务的策略。

下面通过举个例子来理解上述的表示参数。

假如有一个工厂,工厂里面有10个工人,每个工人同时只能做一件任务。因此只要当10个工人中有工人是空闲的,来了任务就分配给空闲的工人做;当10个工人都有任务在做时,如果还来了任务,就把任务进行排队等待;如果说新任务数目增长的速度远远大于工人做任务的速度,那么此时工厂主管可能会想补救措施,比如重新招4个临时工人进来;然后就将任务也分配给这4个临时工人做;如果说着14个工人做任务的速度还是不够,此时工厂主管可能就要考虑不再接收新的任务或者抛弃前面的一些任务了。当这14个工人当中有人空闲时,而新任务增长的速度又比较缓慢,工厂主管可能就考虑辞掉4个临时工了,只保持原来的10个工人,毕竟请额外的工人是要花钱的。

这个例子中的corePoolSize就是10,而maximumPoolSize就是14(10+4)。

也就是说corePoolSize就是线程池大小,maximumPoolSize在我看来是线程池的一种补救措施,即任务量突然过大时的一种补救措施。

下面通过一个例子来了解上述的构造函数。

packagecom.test;importjava.util.concurrent.LinkedBlockingQueue;importjava.util.concurrent.ThreadPoolExecutor;importjava.util.concurrent.TimeUnit;publicclassTestThreadPool{publicstaticvoidmain(String[]args){//创建一个线程池ThreadPoolExecutorthreadPool=newThreadPoolExecutor(3,6,5,TimeUnit.SECONDS,newLinkedBlockingQueue());//通过循环来开启20个任务操作for(inti=1;i<=20;i++){threadPool.execute(newThreadPoolTask());}}}//创建ThreadPoolTask类:classThreadPoolTaskimplementsRunnable{publicvoidrun(){try{System.out.println("开始执行任务:"+Thread.currentThread().getName());Thread.sleep(100);}catch(Exceptione){e.printStackTrace();}}}

上面就是开启20个任务,来让线程池处理,如果线程池满了的话,就会放入到阻塞对列中进行等待操作

不过在javadoc中,并不提倡我们直接使用ThreadPoolExecutor,而是使用Executors类中提供的几个静态方法来创建线程池:

Executors.newCachedThreadPool();//创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUE

Executors.newSingleThreadExecutor();//创建容量为1的缓冲池Executors.newFixedThreadPool(int);//创建固定容量大小的缓冲池

publicstaticExecutorServicenewFixedThreadPool(intnThreads){returnnewThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue());}publicstaticExecutorServicenewSingleThreadExecutor(){returnnewFinalizableDelegatedExecutorService(newThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue()));}publicstaticExecutorServicenewCachedThreadPool(){returnnewThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,newSynchronousQueue());}从它们的具体实现来看,它们实际上也是调用了ThreadPoolExecutor,只不过参数都已配置好了。newFixedThreadPool创建的线程池corePoolSize和maximumPoolSize值是相等的,它使用的LinkedBlockingQueue;

newSingleThreadExecutor将corePoolSize和maximumPoolSize都设置为1,也使用的LinkedBlockingQueue;

newCachedThreadPool将corePoolSize设置为0,将maximumPoolSize设置为Integer.MAX_VALUE,使用的SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。

实际中,如果Executors提供的三个静态方法能满足要求,就尽量使用它提供的三个方法,因为自己去手动配置ThreadPoolExecutor的参数有点麻烦,要根据实际任务的类型和数量来进行配置。

另外,如果ThreadPoolExecutor达不到要求,可以自己继承ThreadPoolExecutor类进行重写。

下面是8位Java牛人,他们为Java社区编写框架、产品、工具或撰写书籍改变了Java编程的方式。

不像ArrayBlockingQueue或LinkedListBlockingQueue,SynchronousQueue内部并没有数据缓存空间,你不能调用peek()方法来看队列中是否有数据元素,因为数据元素只有当你试着取走的时候才可能存在,不取走而只想偷窥一下是不行的,当然遍历这个队列的操作也是不允许的。队列头元素是第一个排队要插入数据的线程,而不是要交换的数据。数据是在配对的生产者和消费者线程之间直接传递的,并不会将数据缓冲数据到队列中。可以这样来理解:生产者和消费者互相等待对方,握手,然后一起离开。

SynchronousQueue的一个使用场景是在线程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue,这个线程池根据需要(新任务到来时)创建新的线程,如果有空闲线程则会重复使用,线程空闲了60秒后会被回收。

阻塞队列的实现方法有许多:

经典同步队列实现采用了三个信号量,代码很简单,比较容易理解:

Java5的实现相对来说做了一些优化,只使用了一个锁,使用队列代替信号量也可以允许发布者直接发布数据,而不是要首先从阻塞在信号量处被唤醒。

代码实现里的DualQueue或Stack内部是用链表(LinkedList)来实现的,其节点状态为以下三种情况:

这个算法的特点就是任何操作都可以根据节点的状态判断执行,而不需要用到锁。

其核心接口是Transfer,生产者的put或消费者的take都使用这个接口,根据第一个参数来区别是入列(栈)还是出列(栈)。

TransferQueue实现如下(摘自Java6源代码),入列和出列都基于Spin和CAS方法:

THE END
1.招临时工的软件哪个好APP推荐招临时工的软件哪个好下载找临时工的app平台推荐2022 找临时工的app哪个好 06-15 专招驾驶员的app哪个好2022 最受欢迎的驾驶员招聘app推荐 03-30 招工人的软件哪个好用 手机版招工人的软件推荐 长期以来,很多公司都在为找找不到合适的工作人员而苦恼,今天小编就为大家介绍一下招工人的软件哪个好用,这些 app没有任何的限制,这些 app的https://www.wandoujia.com/bangdan/1252399/
2.临时工接活app排行榜前十名偏玩手游盒子分享十大临时工接活app排行榜前十名手机应用,编辑为您推荐手机临时工接活app排行榜第一名到前5名到前十名的应用。找临时工接活app有哪些、临时工接活app哪个好用,上偏玩手游盒子https://m.pianwan.com/s/zj-5445024
3.找零工app哪个好?找零活的平台app临时工接单app找零工app哪个好?零工泛指在工作场所里非正式雇用的劳工,无试用期标准直接上岗入职,通常以4至8小时工作日薪几百元,聘用临时工的目的是为了处理短期出现的额外工作。现在为大家推荐几款可以打零工的app,其中有爱零工、打零工、找零工和临时工等,在这里,拥有更多相应的临时工需求,快速选择浏览到招聘信息,查阅到订单详情http://www.downyi.com/key/zhaolinggongapp/
4.招工大全招工平台网最新招工信息维修师傅招聘驻比亚迪车辆延保顾问招聘找个游戏搭子速速集合招聘只招应届生的客服岗位招聘自动化设备维护工程师招聘招聘摄影化妆学徒助理招聘招远海底捞招聘正式工招聘招厨师烧烤师傅勤杂工招聘助理执业医师牙科医生招聘自动化设备售服工程师招聘月入过万的心理咨询师招聘中医大健康项目合伙人招聘早十晚六周末双休培训招聘自动https://www.yupao.com/recruit-list/
5.找工人干活的平台有哪些软件网上找工人干活下单的app大全在我们房子装修还有一些自己搞不来的通下水道等工作的时候,往往找专业的人比较方便,快速的就可以把事情搞定,所以找工人干活的平台就非常重要,因为我们日常生活中是不知道在哪找工人的,所以这种平台就非常方便,可以在上面发布自己的需求还有位置,这样就可以联系到师傅,帮助自己解决问题,下面小编就给大家分享一下网上找http://www.downcc.com/k/zhaogongrenganhuo/
6.兼职招聘招聘兼职人才全职发单员招聘家教传单派发招聘临时乘务员招聘语文家教传单派发招聘数学家教传单派发招聘铁路临时乘务员招聘美容活动传单派发招聘注册事务部实习生招聘高级固件开发工程师招聘销售效率实习生招聘 相关推荐 热门职位 热门城市 热门搜索 全职发单员招聘 家教传单派发招聘 临时乘务员招聘 语文家教传单派发招聘 数学家教传单派发https://m.liepin.com/career/jianzhi/
7.临时工人自动辞职问题关于自动离职的问题 17人问过 综合律师团队已解答 获取解答 > 自动离职问题 劳动合同纠纷 8人问过 找法网咨询顾问已解答 获取解答 > 关于自动离职的问题 企业法律顾问 16人问过 丁良振律师已解答 获取解答 > 还有疑问?直接咨询律师 > 临时工人自动辞职问题 3456 位律师在线解答中相关https://m.findlaw.cn/ask/question_1724297.html
8.临时工人招聘平台HRTechChina.com【美国】临时工人招聘平台Gigs获得了270万美元的种子轮前融资近期,临时工人招聘平台Gigs获得了270万美元的种子轮前融资,该公司正式推出其雇主门户网站,帮助零售商、食品和饮料、物流等企业满足其全职和兼职招聘需求。本轮融资由Wonder Ventures和其他天使投资者领投。Gigs打算利用这些资金投资于产品、工程、市场,以帮助公https://www.hrtechchina.com/tag/%E4%B8%B4%E6%97%B6%E5%B7%A5%E4%BA%BA%E6%8B%9B%E8%81%98%E5%B9%B3%E5%8F%B0/
9.临时工怎么买保险?时工买保险的顺序:意外保险、寿险产品、健康保险。并且,如果公司临时工的人数在五人以上,即可投保团体意外险。也可以单独给员工投保短期意外险,可以根据临时工的具体职业类别选择相应的意外险,如果工作时间较长的可以选择一年期的综合意外险,如果是短期的话,也可以根https://m.64365.com/zs/684372.aspx
10.百事帮临时工人技能服务2024官方下载下载客户端 开放平台 应用宝手机版 应用宝电脑版首页 百事帮临时工人技能服务 百事帮临时工人技能服务 5.0 2.2万下载 兼职 电脑版 扫码下载手机版 预览 简介 雇主可在百事帮灵活用工找人服务;人才可在百事帮自由就业、找活、技能变现,接单挣钱。覆盖上万种技能,包括程序员、临时工、设计、车间工、律师、陪练、https://sj.qq.com/appdetail/com.byb.oldworkers
11.招聘网哪个平台是免费的找临时工人干活到哪个网站?在当今经济持续发展且就业市场竞争愈发激烈的大环境下,找工作已成为众多人生活中无法回避的关键问题。伴随互联网技术的日新月异,越来越多的人将目光投向招聘软件,以期从中寻觅理想的工作契机。然而,究竟哪个找工作的软件真实可信?这是众多求职者时常发出的疑问。当下备受瞩目的招聘平台 毋庸置疑,挑选知名的招聘平台https://baijiahao.baidu.com/s?id=1807795745498971257&wfr=spider&for=pc
12.临时工人干活碰到车祸算工伤吗免费法律咨询不代表任何平台立场,如若内容侵权或错误请通过投诉通道提交信息,我们将按照规定及时处理。 咨询我 薪资谈判律师团 帮助人数:53500 好评率:99.47% 响应时间:3-5分钟内 临时工人干活时碰到车祸是否算工伤,需根据具体情况判断。1. 若临时工人是在执行用人单位安排的工作任务过程中遭遇车祸,一般可认定为工伤。比如https://www.66law.cn/question/49651044.aspx
13.Gigs获得7300万美元B轮融资Gigs是一个临时工人招聘平台,该平台简化了雇主和求职者的匹配过程。雇主可以通过照片和视频的方式在Gigs上展示他们的雇主品牌。对于求职者来说,Gigs能够按照地点列出工作列表,并为每个职位提供薪酬范围。通过这种透明的连接方式,Gigs能够轻松地帮助招聘者找到最合适的临时工。近日,Gigs获得7300万美元B轮融资,Ribbit Capithttps://www.donews.com/news/detail/8/4641954.html
14.临时工劳动合同最长期限是多久临时工人劳动合同最长有效期2023年严昆律师 云南睿信律师事务所 执业认证 平台保障 解决方案 劳动关系是指劳动者与用人单位依法签订劳动合同而在劳动者与用人单位之间产生的法律关系。劳动关系自用工之日起建立。 临时工劳动合同最长期限是多久临时工人劳动合同最长有效期2023年 听律网小编为大家整理了关于临时工劳动合同最长期限是多久临时工人劳动https://m.tinglv.cn/zhishi/6795195.html
15.医生早该被拉下神坛,同理心平常对待(浪漫医生金师傅2)剧评比如08年开播,人气明星聚集,已经拍到第三季的经典日剧《code blue》系列,则聚焦直升机救援这个新颖的角度,讲述更多的是不同性格,不同医生个体的成长和医生工作中各种发人深省的抉择和思考。比如先有韩版,再被日本和美国先后翻拍的《良医》,借一个有自闭症的天才医生融入医院这个小的生态社会的故事背景,在讲述医生https://movie.douban.com/review/12265718/
16.年度销售工作总结(精选20篇)公司位于 镇大村委会 村小组,投资建设共占1000多亩山地,拥有签订合同职工6人,季节性临时工人563人,总资产达639万元。20xx年1月公司成立后,公司提供的水果采摘有柑桔、杨梅、枇杷、李子、桃子等,受到了广大消费者的欢迎和好评。 公司生产的各式优质果蔬均采用现代农业科技手段进行种植,采用频振式杀虫灯,蓟马板、黄板https://www.yjbys.com/zongjie/nianzhongzongjie/1768337.html
17.手机游戏下载手游综合资讯百事帮临时工人技能服务官网版下载 汽车报价大全安卓版下载 淘菜菜团长平台下载 玩美相机下载最新版 河狸家下载免费版 大字体放大下载安卓版 微刷有趣最新版本 涿州房产网手机版 武馆模拟器安卓版本 翻滚吧球球下载免费 叶罗丽魔法公主游戏最新版 西游诀下载最新版 熊猫面馆手机版下载 倒水我最行最新手机版 灵域仙魔手https://www.huanltao.com/
18.经纪人:不幸是旺达出现在伊卡尔迪生活中,因为她国家队大门关闭澳门ag线上平台,ag亚洲游戏集团怎么样,bet365娱乐水果机,bet9十年信誉娱乐,u乐国际pt老虎机客户端安博体育app下载安装,bet007足球即时,ba娱乐官方平台,安徽快三时时开奖,CQ9老虎机客户端奥宇国际app官方正版下载安卓,sky娱乐怎么上不去,澳码精准资料天天免费,MG轮盘多人桌,fb体育首页在线登录bob半岛·体育入口,ca88http://m.xiabu-e.com/20241211/299236254482.html
19.到双目找临时工人照片正版商用图片1a9s5d摄图新视界提供到双目找临时工人图片下载,另有成人,双目,休闲,白种人,浓度,好奇,发现,距离,探索,表达式,富有表现力,面部护理,那家伙,英俊,快乐图片搜索供您浏览下载,每张图片均有版权可放心商用,您正在浏览的图片为1a9s5dhttps://xsj.699pic.com/tupian/1a9s5d.html
20.成都哪里找的到临时工人赶工期用人搬运东西上下楼人力批发成都搬运工、成都装卸工、成都临时干活工人、成都小时工、成都临时工、成都搬货工人、成都搬货上楼人工、成都搬货下楼工人、成都搬家人工、成都兼职临时工、成都干活农民工、成都临时用人搬运、成都建筑垃圾处理、成都装修材料搬运、成都建筑材料搬运、成都搬床垫上下楼工人、成都搬运旧沙发、成都搬运按摩椅、成都装卸机器设http://zwlhkd.cn.china.cn/supply/5114192722.html