范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

  前言
  今天主要来聊一聊如何优雅地停下线程。
  在开始之前,我们可以思考一下,如何能够让线程停下?
  通过查阅JDK,我们不难发现Thread为我们提供了一个stop方法,只要使用stop方法,就立即停止线程,但是发现stop()方法被标注为废弃的方法,因为这个方法会强行把执行到一半的线程终止,可能会引发一些数据不一致或者我们没发预估的问题。
  除了stop()方法,我能想到的方案还有两个,
  方案一:使用volatile标记位,利用其可见性
  方案二:调用Thread的方法interrupted方案实现方案一:使用volatile标记位,利用其可见性
  通过代码我们来看下方案一,这是一个很经典的生产者和消费者模式。
  生产者Demo//生产者 class Producer implements Runnable {     public volatile boolean canc = false;      private Product product;      Producer(Product product) {         this.product = product;     }      @Override     public void run() {         try {             while (!canc) {                 try {                     //Thread.sleep(1000);                     product.put("iphone6s");                     System.out.println("put:" + Thread.currentThread().getName());                 } catch (InterruptedException e) {                     e.printStackTrace();                 }             }         } catch (Exception ex) {             ...         } finally {             System.out.println("结束");         }     } }
  消费者Demo//消费者 class Consumer implements  Runnable{     private Product product;      Consumer(Product product) {         this.product = product;     }      @Override     public void run() {         while (Math.random() > 0.9){             try {                 Thread.sleep(1000);                 product.take("iPhone6s");                 System.out.println("take:"+Thread.currentThread().getName());             } catch (InterruptedException e) {                 e.printStackTrace();             }         }     } }
  调用生产者和消费者public static void main(String[] args) {     ArrayBlockingQueue queue = new ArrayBlockingQueue(1);     Product product = new Product(queue);     Producer producer = new Producer(product);     Consumer consumer = new Consumer(product);     Thread c1 = new Thread(consumer);     Thread p1 = new Thread(producer);     p1.start();     try {         Thread.sleep(500);     } catch (InterruptedException e) {         e.printStackTrace();     }     c1.start();     System.out.println("消费者不需要更多数据了。");     producer.canc = true;     System.out.println(producer.canc);     System.out.println(p1.getState()); }
  场景一: 我们把消费者和生产者的线程都开起来,生产者生产一个产品,消费者都会消费一个产品,这个时候volatile的值,在下一次的轮询中值已经变成了true,就跳出while循环,线程就停止,这个场景下volatile就适用了。
  场景二: 我们将消费者线程不启动,只生产不消费。 理论上我们期待的结果应该也是值变成true,跳出while循环,线程停止。
  结果打印:Put a iphone6s put:Thread-2 消费者不需要更多数据了。 valatile的值: true 线程状态:WAITING
  根据打印的结果我们会观察到他没有输出结束的语句,
  我们看到了生产者生产了产品,valatile也修改了值,但是线程却没有结束,
  这主要的原因是因为,生产者执行了product.put("iphone6s"),没有被消费,造成了阻塞,在它唤醒之前,
  无法进入下一次的轮询判断。造成了值修改了,却没有做出相应处理。
  我们发现在消费的时候,take方法内部会触发唤醒,当检测到线程已经停止,则抛出InterruptedException异常。开源码说话,可以看到dequeue,唤醒了线程。public E take() throws InterruptedException {     final ReentrantLock lock = this.lock;     lock.lockInterruptibly();     try {         while (count == 0)             notEmpty.await();         return dequeue();     } finally {         lock.unlock();     } }  public final void acquireInterruptibly(int arg)         throws InterruptedException {     if (Thread.interrupted())         throw new InterruptedException(); }  private E dequeue() {     ...     //释放     notFull.signal();     return x; } 二、方案二:调用Thread的方法interruptedstatic class CreateRunable implements Runnable {     public CreateRunable(int i) {         this.i = i;     }      private int i;      public int getI() {         return i;     }      public void setI(int i) {         this.i = i;     }      @Override     public  void run() {         synchronized (this){             while ( !Thread.currentThread().isInterrupted() ){                 System.out.println("Runable接口,实现线程"+i++);             }         }     } }Thread createThread = new Thread(new CreateRunable(0)); createThread.start(); Thread.sleep(5); createThread.interrupt();
  休眠5毫秒后,该线程检查到了中断信号,就会停止线程。
  那如果任务正在休眠状态,线程会如何处理呢@Override public  void run() {     synchronized (this){         while ( !Thread.currentThread().isInterrupted() ){             try {                 Thread.sleep(10000);             } catch (InterruptedException e) {                 e.printStackTrace();             }             System.out.println("Runable接口,实现线程"+i++);         }     } }
  抛出异常,同时清除中断状态,线程会继续执行Runable接口,实现线程0 java.lang.InterruptedException: sleep interrupted     at java.lang.Thread.sleep(Native Method)     at main.Thread.threadStartThreeWays$CreateRunable.run(threadStartThreeWays.java:48)     at java.lang.Thread.run(Thread.java:748) Runable接口,实现线程1 Runable接口,实现线程2 Runable接口,实现线程3 总结
  我们在这里就不说Stop()方法,因为他太暴力了,不够优雅。这里的优雅指的是可以让线程有时间做好收尾工作,避免数据的错乱。 优雅停下线程的方式主要有两种方案一:使用volatile标记位。方案二:调用Thread的方法interrupted。
  通过上面的demo案例,我们可以看到使用方案一的volatile,在某一些特殊的场景下,会发生不能关闭线程的情况。
  所以volatile是不够全面的。方案二则是一种更优的选择。

圣诞节无忧!液化天然气进口接近创纪录水平,欧洲气价跌破100欧元随着液化天然气以接近历史最高纪录的水平大量涌入,欧洲天然气价格跌至6月14日以来最低,荷兰基准天然气期货在12月21日周三下跌7。5,跌破每兆瓦时100欧元,报收97。75欧元,甚用信用卡有哪些好处在10年前或者20年前,信用卡的使用还是存在很多争议的,有人觉得它使用方便,有助于管理消费,而且有些高级的信用卡还可以彰显身份。而有的人觉得它鼓励超前消费,容易造成负债和信用不良记全省客运恢复运营记者从我省交通运输部门了解到,截至目前,全省所有道路客运服务已全部恢复运营。近期,为了全面有序做好城市公交客运班车旅游包车出租汽车公交化改造等运输服务工作,我省交通运输部门开展了多福州新能源汽车产业链屡添新军加大招商引资力度,打造产业链闭环福州新能源汽车产业链屡添新军12月,岁暮天寒,福州的土地上却舒展出别样的活力。东南汽车城。记者林双伟摄在马尾,福建时代星云科技有限公司投资的智能化新(经济)以鹅毛之轻托起产业复苏之重贵州锦屏延长鹅产业链赋能乡村振兴近年来,贵州省黔东南苗族侗族自治州锦屏县依托优良的自然环境和养殖传统,将鹅产业作为一县一业产业全面推进。通过引进羽毛球生产企业,以企业为龙头核心,围绕鹅产业建链强链延链。如今,锦屏厨卫产业新形势?2022中国厨卫产业八大挑战与八大对策奥维最新发布2022中国厨卫产业八大挑战与八大对策1万前沿报告免费分享,获取方式见文末。八大挑战VS八大对策市场环境的巨大挑战VS高效增长的核心关键一市场分层用户导向消费人群的细分养老产业突破困境的四大商业模式之四生态金融模式众说康养团圆季生态金融模式投资特性决定了需要基金支持养老产业投资回报周期较长,收益率比较低的投资特性,决定了其与传统住宅有着本质的区别,我国目前养老地产领域虽然汇聚了开发商保险公司依托广州产业带打造高性价比爆款服饰,快手女装商家小敏月GMV超200万从一起在夜市摆摊到经营夫妻店档口,再到在快手月销超200万,从事服装行业十余年,广州商家小敏夫妻俩共同创造了属于自身的逆袭。自线下转战快手电商后,他们的账号小敏品质穿搭凭借优质时尚2022年,红杉高瓴深创投等顶级资本为何多次投资了这些公司?作者李新新来源IT桔子2022年即将过去,在充满诸多变动的情况下,不确定性因素上升使得投资人出手更加谨慎。对比往年不少投资机构在今年则增加了新的投资考量,例如风险性较高的项目减少投4宗兜底,1宗流拍惠州12月集中供地收金超10亿元累计收金超10亿元,12月21日,惠州年中集中供地,共5宗地块挂牌出售,其中4宗兜底成交,1宗流拍。仲恺城市发展集团惠东交投等国有企业兜底拿地。成交的4宗地块分别位于仲恺沥林潼湖惠招商宏观经济重启,会有劳动力缺口吗?文招商宏观张静静团队核心观点疫后欧美出现了不同程度的就业缺口,这也引发了市场对于国内放开后劳动力短缺的担忧。事实上,国内劳动力市场当前的主要问题是周期性失业和结构性失业叠加下的失业
玉林又一网红打卡地火了!官方不要去近日,玉林又出现一个网红打卡地这个地方就是容县宁冲水库,在短视频平台上入围玉林市景点人气榜宁冲水库,是容县城区居民生活饮用水主要水源地,也是该县饮用水水源二级保护区。水库四周青山环爱达邮轮cosma号开启处女航,迪拜港迎来202223年邮轮季11月17日,迪拜港迎来了来自爱达邮轮公司的AIDAcosma号,正式开始了202223年的邮轮季。AIDAcosma号是爱达船队中最大的邮轮之一,而且该船是爱达邮轮第一艘由液化天合肥大圩火龙果红火上市来源人民网安徽频道nullnullnullnull连日来,合肥市包河区大圩镇的红心火龙果陆续成熟上市,果农抢抓时机采摘包装销售,同时也吸引了不少市民和游客前来采摘购买。近年来,大圩莲池轶事古莲花池,原名雪香园,位于河北省保定市区中心,始建于元太祖二十二年(1227年)由于园内池塘中荷花茂盛,所以称为古莲花池。占地24000平方米,是中国十大历史名园之一。古莲花池是集印象卢氏卢氏人心心念念的大天鹅,真的来了!初冬时节,暖阳高照,在洛河卢氏县范里镇苗村段,10余只白天鹅在此悠闲地游弋自由地觅食,与周边湖光山色融为一体,构成了一幅人与自然和谐共生的美丽画卷。近年来,卢氏县坚持生态立县三生融新包LOEWE上架2023春夏系列男士新包明亮橘色,橡胶材质方形包新包LOEWE上架2023春夏系列男士新包明亮橘色,橡胶材质方形包LOEWE本周率先上市2023男士春夏系列作品,包袋以明快的橙橘色内敛的沥青灰色为主旋律,推出全新MoldedSl这11部豆瓣8分的体育题材影视剧,哪个是你心中的NO。1?文叶秋臣因为本人非常喜欢篮球,所以看了不少相关领域的作品,比如定期重温的动画灌篮高手和空中大灌篮等等,甚至连台剧篮球火这种稍微沾点边儿的都追完了,单纯推荐篮球题材的话也能列出一个长性感御姐姿态婀娜妩媚,端庄气质撩人心怀,袅袅气息淋漓绽放1前男友突然频繁地进入你的空间,请你别想太多,可能是他有个手欠的现女友。2每当男人说整理好了自己的房间时,标准通常指的是从门到床之间的路已经打通了。3许多伤害本来就是一次性的,可能鉴道秦始皇雄才大略!胸怀天下秦始皇赢政史迹01少年继位秦始皇,赢政,秦庄襄王之子,战国时期秦国国君,秦王朝的建立者。即位时年仅13岁,吕不韦与太后宠信的宦官嫪毐专权用事。秦王政九年亲政后,镇压嫪毐叛乱。次年,能在心中伴你一生,此生足矣红尘一世,总会遇见一个人,让你倾心。时光深处,总会有一份爱恋,难以忘怀。在我内心深处,住着一个我深深爱着的你,掩埋着一段回不去的曾经,在那个回不去的经年岁月里,我和你曾邂逅了这世间人间烟火气最抚凡人心汪曾祺先生有一本书名为人间烟火最抚人心。甚是喜欢,于是就腆着脸化为己用。你我皆凡人,生在这人世间,终日奔波苦,一刻不得闲。然而,不管白天多么奔波多么辛苦,华灯初上,当回家后看到餐桌