当前位置: 首页 > news >正文

丽水市住房和城乡建设局网站政务中心网站自身建设

丽水市住房和城乡建设局网站,政务中心网站自身建设,赣州网站建设信息,建设厅投诉网站首页一、什么时候我们需要中断一个线程在实际的开发中#xff0c;有很多场景需要我们中断一个正在运行的线程#xff0c;就比如#xff1a;当我们使用抢票软件时#xff0c;其中某一个通道已经抢到了火车票#xff0c;这个时候我们就需要通知其他线程停止工作。当我们希望在一… 一、什么时候我们需要中断一个线程在实际的开发中有很多场景需要我们中断一个正在运行的线程就比如当我们使用抢票软件时其中某一个通道已经抢到了火车票这个时候我们就需要通知其他线程停止工作。当我们希望在一个限定的时间里获得任务结果的时候也需要在任务超时的时候关闭它但是Java并不能像代码块中的break一样干脆的退出线程运行Java本身提供的API方法总是让人觉得差强人意没有办法完美的解决我们的需求那么我们该如何优雅的停止一个线程呢二、如何终止一个线程1) 暴力停止1. 使用stop方法停止线程Java在停止线程的运行方面提供了一个stop的方法首先我们写段代码演示stop方法是如何终止线程的package xiao.thread.stop;public class StopThread {private static int count;public static void main(String[] args) throws InterruptedException {// first :create a thread task Thread thread new Thread(() - {while (true) {count;// 为了减少打印数 增加个计数判断 //也可调用sleep方法进行休眠if (count % 100 0) { System.out.println(此时线程依旧存活 count);}}}, thread_task for stopThread); thread.start();// 如果直接终止 很有可能thread的run方法还没有开始执行 所以建议让main线程休眠一段时间来观察效果 Thread.currentThread().sleep(1_000); thread.stop();}}首先我们可以明显的观察到当我们调用stop的时候线程被暴力停止了。这种方式虽然简单但是java语言本身并不提倡我们这么做。stop()方法呈删除线状态已经表明了这个方法已经被弃用。2. 为什么不提倡使用stop方法其实不提倡使用stop方法的原因很简单因为线程最优状态的终止是只能自杀而不能被杀。具体的来说就是当我们通过其他线程调用stop方法时此刻我们并不知道被杀死的线程执行到了哪里。就比如我们在做一个为集合添加数据的操作我们此时无法知道数据的添加进行到了哪一步。而当我们调用stop方法此时被杀死的线程会立即释放自身持有的锁其他线程此时就可以看到未被处理完的数据造成线程安全的问题破坏了对象的一致性。2) 捕获异常法1. 中断机制中断很好理解它本身其实并不具备中断的能力只是一种协作机制。在java中并没有对中断进行任何语法层面的实现只能够靠我们利用已有的中断标识来记性业务处理达到中断的目的。2. 相关API在实现中断功能时我们常用的API主要是三个方法1. public void interrupt调用此方法会将线程的中断标识设为true2. public boolean isInterrupt调用此方法将会返回此刻现成的中断标识3.public static boolean interruped该方法只能通过Thread.interrupted()调用他会做两个操作第一步返回当前线程的中断状态第二部将当前现成的中断标识设为false3. 证实interrupt没有停止线程的能力首先我们举个小例子来证明当我们调用interrupt方法时jvm无法为我们中断目标线程public class InterruptThread {private static int count;public static void main(String[] args) { Thread thread new Thread(() - {while (true) { System.out.println(线程依旧存活:_此时计数器状态为_ count);try { Thread.currentThread().sleep(1_000);} catch (InterruptedException e) {}}},测试线程); thread.start(); thread.interrupt();}}我们看下输出结果虽然我们在调用start方法后立即调用了interrupt但是目标的测试线程依旧每隔一秒在控制台打印了计数器状态并没有实际的中断线程通过这个例子我们证明了在我们调用interrupt的时候jvm并没有立即为我们停止目标线程的运行如果我们想要在调用interrupt之后停止线程该如何做呢4. 异常处理法停止线程既然我们证实了jvm确实不会主动地替我们中断线程那么我们就需要利用interrupt方法中提到的中断标识来做一些事情。首先我们需要证明一个新的论点当阻塞方法接收到中断信号的时候会抛出一个InterruptedException 异常那么我们改造下上面的代码public class InterruptThread {private static int count;public static void main(String[] args) throws InterruptedException { Thread thread new Thread(() - {while (true) { System.out.println(Thread.currentThread().getName()正在运行~);try { Thread.currentThread().sleep(2_500);} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace(); System.out.println(Thread.currentThread().getName()接收到中断异常);}}}, 测试线程); thread.start(); Thread.currentThread().sleep(1_000); thread.interrupt();}}运行结果在这里我们可以看出当我们调用interrupt方法时由于线程此时也调用了可能将线程阻塞的方法sleep因此此时目标线程在收到我们的中断信号的时候抛出了interruptException但是由于while方法体里面还有代码需要执行线程此时并没有结束这个时候我们就需要利用我们捕获到的异常改造下代码:public class InterruptThread {private static int count;private static boolean mark true ;public static void main(String[] args) throws InterruptedException { Thread thread new Thread(() - {while (mark) { System.out.println(Thread.currentThread().getName()正在运行~);try { Thread.currentThread().sleep(2_500);} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace(); mark false ; System.err.println(Thread.currentThread().getName()接收到中断信号);}}}, 测试线程); thread.start(); Thread.currentThread().sleep(1_000); thread.interrupt();}}运行结果:可以看出程序在接收到我们的中断信号后就没有继续运行线程停止。而上面代码的变化其实就发生在while的判断条件上我们加入了一个布尔变量mark通过捕获异常停止线程的原理其实也很简单我们认为的设置一个中断变量将该值设置为代码运行的入口条件当我们捕获到异常的时候改变中断变量的值以达到跳出循环的目的从而实现停止线程。当然实现跳出循环的方式有很多我们也可以通过return关键字实现跳出循环的效果public class InterruptThread {public static void main(String[] args) throws InterruptedException { Thread thread new Thread(() - {while (true) { System.out.println(Thread.currentThread().getName()正在运行~);try { Thread.currentThread().sleep(2_500);} catch (InterruptedException e) { e.printStackTrace(); System.err.println(Thread.currentThread().getName()接收到中断信号);return ;}}}, 测试线程); thread.start(); Thread.currentThread().sleep(1_000); thread.interrupt();}}运行结果通过return也可以很好地利用异常来结束线程的运行。当然我们还有个关于interruptException异常的问题要说下在实际的开发中我们不能不管不顾的通过抛出异常的方式来结束线程如果你只是想记录日志那么此时应该将中断标记重新置为false以避免程序意外中断3) 通过守护线程实现(了解即可)我们也可以利用守护线程的特性来结束一个线程的运行如果不了解守护线程的特性,可以看我之前的文章线程的简介下面我们先看代码实现:public class DaemonThreadInterrupt {public static Thread thread;public boolean flag true;public void execut(Runnable task) { thread new Thread(()-{ Thread thread2 new Thread(task任务线程); thread2.setDaemon(true); thread2.start();try { thread2.join();} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}},执行线程); thread.start();}public void stop() { thread.interrupt();}public static void main(String[] args) { DaemonThreadInterrupt daemonThreadInterrupt new DaemonThreadInterrupt(); daemonThreadInterrupt.execut(()-{while(true) { System.out.println(程序运行);try { thread.sleep(1_000);} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}}}); daemonThreadInterrupt.stop();}}实现原理:在上述代码中,我将需要实现的任务线程放到了一个执行线程中,执行线程不负责任何业务逻辑的处理,只负责启动任务线程。而任务线程在启动后将他设为了执行线程的守护线程。然后让他join到执行线程中。然后接下来我们就利用了join方法的特性以及守护线程的特点设计了stop方法执行join方法后执行线程将等待任务线程执行完毕后才会执行但是当我们调用interrupt方法时join方法接收到中断信号就会抛出异常此时执行线程不在等待任务线程的运行。重点来了此时执行线程执行完毕任务线程作为执行线程的守护线程也结束了他的生命周期。这种方式充分利用了线程的多种特性停止了一个线程而且结束的过程可控也可设置延时结束适合用作定时任务线程的实现。
http://www.pierceye.com/news/664934/

相关文章:

  • 旅游网站开发需求分析网站的根目录的路径
  • easyUI网站开发docker wordpress mysql
  • dede手机网站模板下载黄冈做网站
  • 诸城网站建设葛小燕现在搜索引擎哪个比百度好用
  • 嘉兴做微网站多少钱注册网页需要多少钱
  • 论坛类网站设计大型网站系统解决方案
  • 网站建设中页面设计广告策划书籍
  • 云南省建设工程投标中心网站网页的制作步骤是什么
  • 保定网站设计概述更换动易网站模板的方法
  • 新手如何注册网站域名做 理财网站有哪些
  • 南宁快速建站模板企业网站的开发与应用
  • 网站运营适合什么样的人做企业宣传及介绍ppt
  • 怎么样网站开源小升初在线做试卷的网站
  • 中国建设银行章丘支行网站网站排版设计欣赏
  • 儿童摄影网站建设专业做网站制作自助建站系统
  • 注册做网站的公司有哪些wordpress 4.1 下载
  • 用ps做美食网站一个网站多少钱?
  • 网站建设 试题揭阳专业做网站公司
  • 手机上怎么创建自己的网站河南企业网站优化
  • 定陶区城乡和住房建设局网站新手怎么做网站
  • 工商银行与建设银行网站对比石嘴山网站seo
  • seo快速建站自学程序员的步骤
  • 做旅行网站的依据及意义如何制作自己想要的图片
  • 电子商务网站怎么做网站建设企业建站哪家好?来这里看看
  • 网站备案电话号码购物商城网站建设方案
  • 手机商城系统徐州seo计费管理
  • 西安网站公司哪家好信息推广的方式有哪些
  • 网站开发注意的事项商丘网站制作软件
  • 51zwd一起做网站广州广东省网站备案查询
  • 如何生成一个网站自己弄公司网站