专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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

  前言
  今天主要来聊一聊如何优雅地停下线程。
  在开始之前,我们可以思考一下,如何能够让线程停下?
  通过查阅JDK,我们不难发现Thread为我们提供了一个stop方法,只要使用stop方法,就立即停止线程,但是发现stop()方法被标注为废弃的方法,因为这个方法会强行把执行到一半的线程终止,可能会引发一些数据不一致或者我们没发预估的问题。
  除了stop()方法,我能想到的方案还有两个,
  方案一:使用volatile标记位,利用其可见性
  方案二:调用Thread的方法interrupted方案实现方案一:使用volatile标记位,利用其可见性
  通过代码我们来看下方案一,这是一个很经典的生产者和消费者模式。
  生产者Demo生产者classProducerimplementsRunnable{publicvolatilebooleancancfalse;privateProductproduct;Producer(Productproduct){this。productproduct;}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{privateProductproduct;Consumer(Productproduct){this。productproduct;}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。canctrue;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;lock。lockInterruptibly();try{while(count0)notEmpty。await();returndequeue();}finally{lock。unlock();}}publicfinalvoidacquireInterruptibly(intarg)throwsInterruptedException{if(Thread。interrupted())thrownewInterruptedException();}privateEdequeue(){。。。释放notFull。signal();returnx;}二、方案二:调用Thread的方法interruptedstaticclassCreateRunableimplementsRunnable{publicCreateRunable(inti){this。ii;}privateinti;publicintgetI(){returni;}publicvoidsetI(inti){this。ii;}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是不够全面的。方案二则是一种更优的选择。

丁磊从上汽老炮浦东区长到华人运通志在改变出行汽车面孔连载76汽势AutoFirst周光军著曾官至上海浦东新区副区长的丁磊最终还是回到了汽车行业。只是,两次选择都不是传统汽车行业。一次是短暂的乐视汽车,一次是创立自己的品牌华人运通。当时,副区小米13再次售罄,好评高达98,但买之前记得看下这几个差评相信大部分人都没想到,在去年年末发布的小米13系列新机,又卖爆了。仅一家旗舰店就收获了5W的评价,而且最夸张的是好评率居然高达98。下面我们就来看看这次的新机好在哪,而差评又是什么浅谈我做网络直播的日子现在很多人在喊网络直播赚钱,那它到底赚钱吗?因为疫情,我闲着无事,约了几个兄弟在一起喝酒聊天,其中的一个兄弟手里有一套直播器材,原打算是给孩子直播游戏用的,结果,孩子不肯接受,闲置一刻不能等一刻等不得吉林各地抢抓开年经济见闻新年新气象,经济复苏的景象在吉林省处处呈现,银装素裹下一片热火朝天。奥迪一汽新能源汽车吉林石化转型升级比亚迪动力电池一批重大项目加速推进。在广袤的黑土地上,吉林干部群众以一刻不能等大平台激发新动能,中山火炬区成制造业金梧桐1月30日,在省市高质量发展大会召开后不久,火炬开发区重大平台就以起跑就是冲刺,开工就是开战的姿态跑出了新征程加速度。在火炬开发区2023年第一季度制造业项目集中动工仪式暨火炬开发济南起步区飞向太空,长征火箭这张图刷屏的背后来源爱济南新闻客户端济南新旧动能转换起步区伴随黄河重大国家战略应运而生,并在国务院关于支持山东深化新旧动能转换推动绿色低碳高质量发展的意见中赋予新的使命任务。起步区党工委在加快推进50多岁的打工者,社保中断10年了,2023年还能续交吗?50多岁的打工者,社保已经中断10年的时间了,那么今年2023年还能不能够继续缴纳呢?我们说这肯定是可以继续缴纳的,无论你参加的是属于城乡居民养老保险,还是属于城镇职工养老保险,都薇娅消失1年转身资本后赚得更多了薇娅停播了一年了,是不是因为被禁而没落了呢?今天来讲一讲薇娅的商业帝国。薇娅现在干嘛去了,做什么了?我告诉你,这些主播他们都寻求一个华丽的转身,只不过对于薇娅而言,这个转身不够华丽MacBookPro2023拆解总结内部3处设计略有不同新款搭载M2Pro与M2Max芯片的MacBookPro将于2月3日正式发售,那么2023款相较于上一代在内部设计有何不同呢?下面就分享来着外网iFixit针对新款MacBookP鲁西新区综合行政执法局开展餐饮具清洗消毒企业专项检查中国山东网感知山东2月1日讯(记者吴鲁刚通讯员王宾)为加强餐饮具消毒企业管理,切实保障餐饮具卫生安全,1月31日,鲁西新区综合行政执法局联合文化卫生服务中心成立专项检查组,对辖区餐2月起江西庐山实行免收门票政策视频加载中央广网庐山2月1日消息(记者邓玉玲通讯员胡晓山龚志兴)近日,江西庐山风景区发布公告称,为进一步回馈广大游客,扩大文旅消费,景区将从2月起向全球游客实行免收门票政策。公告显
新概念英语适合哪种英语水平的人?新概念英语共分四册,下面分别谈一下各册的难度水平第一册最简单,基本上是从零基础开始的,对没有任何英语基础的人来说,他们需要从第一册开始学起。第二册的难度大概属于小学初中的水平,除了洛阳,南阳信阳,哪个地方更适合旅游?应该说,河南的这三个城市在河南的18个地市里来说,算是比较不错的了。南阳信阳生态会更好一些吧。这三个城市自己都曾去过两次以上,洛阳曾去过多次。说到旅游,就目前的情况来看,个人感觉还在化工厂上班是什么感受?你好,很高兴回答你的问题!我的感受是非常的无奈,累,危险,工作环境差,我实在是忍不住就走了!我2012年在我们当地的一个化工厂做了两个月就出来了!化工厂可能大家只是听说过,而且还有对农村白事攀比愈演愈烈花费惊人,你怎么看?坐标鲁西南农村,在我们这里白事的消费大都是一成不变的,不存在什么攀比的情况,死不起这种情况更是子虚乌有的事情,白事上面过度消费是会被严格禁止的,村里面有红白理事会监管,每个家族的长说说上世纪六七十年代农村过春节,你那里都吃些什么?我就是七零后的农村娃,我最有发言权。六七十年代的中国农村,你想想吧,还没有实行家庭联产承包,大家都是在大集体参加生产劳作。那时候还是公社制度,参加集体劳作的农民吃饭都是在生产大队的河南北部农村一天三顿饭都吃什么,你最爱吃什么?我在河南洛阳,也不算河南很靠北,但是我觉得饮食都没有什么大的差异。农村的,民风比较淳朴,所以每天吃的东西也比较简单。可能我们在城市中一天能吃三样,在农村,一般一天吃两样东西。早上和33岁被外贸公司辞退,想转行做会计,好找工作吗?目前在考初级,来得及吗?会计真的是专业性的。可能你也曾听过身边非专业的人做会计吧!刚好我现在的工作是这样的,我做的是一家商贸公司,他们的财务就是非专业的都可以做。我开始也是特别郁闷,因为我用专业来看他们做唐山有可能成为二线城市吗?真的不需要对几线城市感兴趣,没有明确标准,也没有可比性。城市的发展一定要找好自己的定位,要根据自己的客观条件制定符合自己情况的发展战略。唐山有自身的优势,只是这几年产业结构调整的步只有女儿没有儿子的父母算不算绝后?按生物学说法,生儿生女都是将血统传递下去,但按古代传统观念确实是绝后了只要有儿子,哪怕这个儿子和自己没有血缘关系,只要跟自己姓,也不算绝后(所以戴绿帽子不算绝后)比如后周郭威,传位找工作中,面试官问你最大的缺点是什么?该如何回答?我最大的缺点,就是不能及时的发现自己的缺点和错误,并加以改正。这个问题的本质,是面试官在考察的自我认知。自我认知是一个心理学的概念,它的英文叫做selfcognition,讲的是一喜欢与校长对着干的老师,是什么心理?我曾经就和校长对着干过,因为他一直欺负老实人,老实人忍不住,终于爆发了!我是出身农民,老公也是普通老百姓,没有任何背景和关系。工作全凭自己的兢兢业业,认真负责。有些人当校长,安排工
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网