临汾山东漯河饰品美体美文
投稿投诉
美文创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品
漯河衢州
兴义眉山
桂林阳泉
玉溪简阳
山东遂宁
永城新余
梧州洛阳
泸州温州
临汾清远
营口常熟
浙江大连
桐乡宜昌

如何优雅地停下线程?除了这两种,你还能说出一种算我输

7月23日 夜如影投稿
  前言
  今天主要来聊一聊如何优雅地停下线程。
  在开始之前,我们可以思考一下,如何能够让线程停下?
  通过查阅JDK,我们不难发现Thread为我们提供了一个stop方法,只要使用stop方法,就立即停止线程,但是发现stop()方法被标注为废弃的方法,因为这个方法会强行把执行到一半的线程终止,可能会引发一些数据不一致或者我们没发预估的问题。
  除了stop()方法,我能想到的方案还有两个,
  方案一:使用volatile标记位,利用其可见性
  方案二:调用Thread的方法interrupted方案实现方案一:使用volatile标记位,利用其可见性
  通过代码我们来看下方案一,这是一个很经典的生产者和消费者模式。
  生产者Demo生产者classProducerimplementsRunnable{privatePProducer(Productproduct){this。}Overridepublicvoidrun(){try{while(!canc){try{Thread。sleep(1000);product。put(iphone6s);System。out。println(put:Thread。currentThread()。getName());}catch(InterruptedExceptione){e。printStackTrace();}}}catch(Exceptionex){。。。}finally{System。out。println(结束);}}}
  消费者Demo消费者classConsumerimplementsRunnable{privatePConsumer(Productproduct){this。}Overridepublicvoidrun(){while(Math。random()0。9){try{Thread。sleep(1000);product。take(iPhone6s);System。out。println(take:Thread。currentThread()。getName());}catch(InterruptedExceptione){e。printStackTrace();}}}}
  调用生产者和消费者publicstaticvoidmain(String〔〕args){ArrayBlockingQueuequeuenewArrayBlockingQueue(1);ProductproductnewProduct(queue);ProducerproducernewProducer(product);ConsumerconsumernewConsumer(product);Threadc1newThread(consumer);Threadp1newThread(producer);p1。start();try{Thread。sleep(500);}catch(InterruptedExceptione){e。printStackTrace();}c1。start();System。out。println(消费者不需要更多数据了。);producer。System。out。println(producer。canc);System。out。println(p1。getState());}
  场景一:我们把消费者和生产者的线程都开起来,生产者生产一个产品,消费者都会消费一个产品,这个时候volatile的值,在下一次的轮询中值已经变成了true,就跳出while循环,线程就停止,这个场景下volatile就适用了。
  场景二:我们将消费者线程不启动,只生产不消费。理论上我们期待的结果应该也是值变成true,跳出while循环,线程停止。
  结果打印:Putaiphone6sput:Thread2消费者不需要更多数据了。valatile的值:true线程状态:WAITING
  根据打印的结果我们会观察到他没有输出结束的语句,
  我们看到了生产者生产了产品,valatile也修改了值,但是线程却没有结束,
  这主要的原因是因为,生产者执行了product。put(iphone6s),没有被消费,造成了阻塞,在它唤醒之前,
  无法进入下一次的轮询判断。造成了值修改了,却没有做出相应处理。
  我们发现在消费的时候,take方法内部会触发唤醒,当检测到线程已经停止,则抛出InterruptedException异常。开源码说话,可以看到dequeue,唤醒了线程。publicEtake()throwsInterruptedException{finalReentrantLocklockthis。lock。lockInterruptibly();try{while(count0)notEmpty。await();returndequeue();}finally{lock。unlock();}}publicfinalvoidacquireInterruptibly(intarg)throwsInterruptedException{if(Thread。interrupted())thrownewInterruptedException();}privateEdequeue(){。。。释放notFull。signal();}二、方案二:调用Thread的方法interruptedstaticclassCreateRunableimplementsRunnable{publicCreateRunable(inti){this。}publicintgetI(){}publicvoidsetI(inti){this。}Overridepublicvoidrun(){synchronized(this){while(!Thread。currentThread()。isInterrupted()){System。out。println(Runable接口,实现线程i);}}}}ThreadcreateThreadnewThread(newCreateRunable(0));createThread。start();Thread。sleep(5);createThread。interrupt();
  休眠5毫秒后,该线程检查到了中断信号,就会停止线程。
  那如果任务正在休眠状态,线程会如何处理呢Overridepublicvoidrun(){synchronized(this){while(!Thread。currentThread()。isInterrupted()){try{Thread。sleep(10000);}catch(InterruptedExceptione){e。printStackTrace();}System。out。println(Runable接口,实现线程i);}}}
  抛出异常,同时清除中断状态,线程会继续执行Runable接口,实现线程0java。lang。InterruptedException:sleepinterruptedatjava。lang。Thread。sleep(NativeMethod)atmain。Thread。threadStartThreeWaysCreateRunable。run(threadStartThreeWays。java:48)atjava。lang。Thread。run(Thread。java:748)Runable接口,实现线程1Runable接口,实现线程2Runable接口,实现线程3总结
  我们在这里就不说Stop()方法,因为他太暴力了,不够优雅。这里的优雅指的是可以让线程有时间做好收尾工作,避免数据的错乱。优雅停下线程的方式主要有两种方案一:使用volatile标记位。方案二:调用Thread的方法interrupted。
  通过上面的demo案例,我们可以看到使用方案一的volatile,在某一些特殊的场景下,会发生不能关闭线程的情况。
  所以volatile是不够全面的。方案二则是一种更优的选择。
投诉 评论

想旅游?错过了春天的鸡鸣寺别再错过秋天的中山陵在南京,春去鸡鸣寺,秋到中山陵。转眼已至深秋,春天错过鸡鸣寺樱花的小伙伴们,也不要觉得遗憾,因为秋天的中山陵亦是姹紫嫣红。有道是六朝金粉地,最忆是金陵这里不仅有奢华雅致的美龄宫……造个院子,品味山野趣事,自然生活在城市之中充斥着水泥钢筋、车水马龙的喧嚣若是能够在某一个角落里有一座院子和这个城市格格不入却又莫名契合的院子从远处看,也是钢精水泥打造的房子……如何优雅地停下线程?除了这两种,你还能说出一种算我输前言今天主要来聊一聊如何优雅地停下线程。在开始之前,我们可以思考一下,如何能够让线程停下?通过查阅JDK,我们不难发现Thread为我们提供了一个stop方法……14场4球4助!国足锋线又有大将可用了,25岁前中超新人王复相信不少球迷都觉得,最近两年困扰国足多年的锋无力得到了解决。在过去十几年里,我们国足的锋线一直靠在中超踢边前卫的郜林来担当,虽然郜林有身高,具备不错的拿球过人能力,但是他的终结……中金回应90后交易员月入超8万该员工正被停职调查中7月29日,90后券商交易员月入超8万引发网友热议,据悉,晒薪酬的并非员工本人,而是其妻子所为。28日,一名博主在小红书上晒出了其夫的收入证明及两人合照,并配文:93年老……您知道吗?酸奶居然有美容养颜的作用随着社会的进步,人类在吃的方面也是新意百出。从开始的牛奶,到后来的优酸乳,再到现在非常流行的酸奶。总之,是加入了各种不同的营养成分,所以,现在酸奶的营养也是最全面的。很多人喜欢……加密货币对洗钱来说太可怕了Binance自加密货币进军主流媒体以来,在传统金融和虚拟资产方面进行了一些相似之处。那些批评新兴行业的人继续攻击空间,声称加密是洗钱的避风港。然而,Binance有不同的论点。加密和洗钱:……为什么建议大家选iPhone13而不是苹果14?四点原因很真不可否认,现在有非常多的消费者都被iPhone手机给转移走了注意力,因为每年的苹果新机发布的时候,都会在手机市场中引起非常高的热度,所以很多厂商都不会在这个节点发布新机。……9月2728日篮球热点事件!欧文谈杜兰特,詹姆斯表态支持威少首次发布于公众号:篮球老友记欧文:我执行球员选项,杜兰特却申请交易,这真的有点尴尬2022年9月27日,欧神仙接受了采访,谈及了球队夏天的闹剧:我选择执行球员选项,……今年豆腐裤又火了!40岁的你不穿一次,都不知道有多洋气显瘦穿搭要符合身材,同时也要符合年龄,尤其是40的女人,穿衣搭配一定要注意,不要乱穿乱搭,显得土气廉价,今年很火的豆腐裤,减龄洋气,不挑年龄,穿起来很好看!什么是豆腐裤呢?泛……高价抢人官宣在即,滴滴造车,入坑还是破局?进入2022年,有关滴滴造车的传闻甚嚣尘上,高调的抢人大战首当其冲,传闻原来在传统车企多少薪酬,滴滴加50。根据接近滴滴的内部人士消息,滴滴造车可能很快官宣。滴滴造车,有……2022卡塔尔世界杯即将开打,球王贝利将预言哪个球队夺冠呢?贝利一开口,世界足坛抖三抖!这话绝不夸张。一直以来,在世界杯上,但凡贝利看好的球队,基本没有好下场。贝利从1990年意大利世界杯开始,精准地对每届世界杯的夺冠热门进行预测,紧接……
六位知名艺人集体翻车!代言理财产品跑路,目前涉案金额4000这个世界上总有那么一批人想通过高收益赚取别人的利息,殊不知这会伴随巨大的风险,而别人看上的则是你的本金,一个不小心就会导致血本无归。近日,一个名为同义汇的理财产品爆雷,涉……跟着大赛游雅安!雅安的美,等你去发现12月13日,骑遍四川2022环茶马古道雅安国际公路自行车赛在雅安启动。来自全国各地的自行车选手将在天府之肺熊猫故乡的魅力赛道中,挑战自我、争夺桂冠。在这里雅雅也诚……荣耀手机变化太大,从性能走向影音,再从影音走向性能看文章听音乐是种享受,想听什么留言告知(都是付费无损包)比起其他国产品牌如同疯癫的同质化和跟风趋势,如果站在一个理性的方向来重新看荣耀手机,你就会感受到荣耀手机这个品牌和……春山如笑,迎接美好的女孩名诗词自古就离不开风花雪月,也是这样写景抒情的诗句最令读者着迷,情景交融的画卷徐徐展开,映入眼帘的是一片片诗情画意的田园之色,是一幅幅生机盎然,莺莺燕燕的自然之景,是一脉脉溪水潺……不比不知道,原来苹果这么过分,相比之下,小米良心多了没想到手机有一天会成为人们生活如此重要的工具,而手机作为电子产品难免会遇到各种售后问题,而对于电子产品的售后问题,国家也有明确的规定。有些品牌出了问题会积面对,而有些大牌却把消……儿童扁平足的康复干预策略了解正常足弓:足弓的形成:新生儿没有足弓,随着生长发育一般1214岁左右才完全形成。发育过程中,前足后足间的螺旋扭转:婴儿开始直立行走后,足跟逐渐扭向外侧,从足中部……不装了?华为寒气蔓延,苹果台积电特斯拉等巨头无一幸免在过去3年里,华为遭到了多次打压,这也使得华为陷入了低谷。但好不容易活下来,进入2022年后,全球芯片市场、智能手机市场、电动汽车市场等又进入了寒冬期,华为感受到了浓浓的寒气。……霸屏热搜!火爆全网的羊了个羊被指抄袭,背后公司回应近日,一款名为羊了个羊小游戏突然爆火,连续霸榜热搜。据悉,这是一款卡通背景的消除闯关游戏。玩家们需要点击上方卡牌,被选中的卡牌会下移到底部的木框中,框内最多可以储存7张卡……一奶同胞一生一世情一辈子亲情不变夏去秋至,万物开始凋零,微风拨动着花瓣上羞涩可人的露珠,梧桐叶纷纷下落,金黄的稻穗在秋风中摇曳,深红的果实在枝头吵闹,看似冷酷的秋季却带来人们喜悦。国庆节之前我们姐弟就约……今年低腰裙突然火了!比你想象中时髦高级,小个子女生很适合一直以来在时尚圈内,其实高腰的设计裙装总是会更加受欢迎且成为优选的搭配,而在今年当中真的是想不到低腰裙的搭配突然就火了!其在对于时髦感和洋气感的衬托效果真的是吊打高腰裙,……美国巨头出尔反尔,退出中国市场又重返,并公然挑战国人底线原创Run琳威互联网时代对人们的生活方式有巨大的影响,它改变了各行各业的运作方式,也催生出一堆从未有过的行业。在互联网行业中,最先创立起来的网购平台就是亚马逊,在国际上也……对未来的思考我是91年生的人,今年准确讲是31岁了,但从我的身份证年龄讲我已经被迫35岁了,因为小时候身份证父母虚报了4岁,在法律上我不得不承认我是87年生人。之所以说到这事坦白说年龄被迫……
友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找