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

三门峡网站建设深圳高端网站建设

三门峡网站建设,深圳高端网站建设,网站sem怎么做,网站关键词用什么符号停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作#xff0c;也就是放弃当前的操作。在 Java 中有以下 3 种方法可以终止正在运行的线程#xff1a;使用退出标志#xff0c;使线程正常退出#xff0c;也就是当 run() 方法完成后线程中止。使用 stop() 方法强…停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作也就是放弃当前的操作。在 Java 中有以下 3 种方法可以终止正在运行的线程使用退出标志使线程正常退出也就是当 run() 方法完成后线程中止。使用 stop() 方法强行终止线程但是不推荐使用这个方法该方法已被弃用。使用 interrupt 方法中断线程。1. 使用标志位终止线程在 run() 方法执行完毕后该线程就终止了。但是在某些特殊的情况下run() 方法会被一直执行比如在服务端程序中可能会使用 while(true) { ... } 这样的循环结构来不断的接收来自客户端的请求。此时就可以用修改标志位的方式来结束 run() 方法。public class ServerThread extends Thread {//volatile修饰符用来保证其它线程读取的总是该变量的最新的值public volatile boolean exit false;Overridepublic void run() {ServerSocket serverSocket new ServerSocket(8080);while(!exit){serverSocket.accept(); //阻塞等待客户端消息...}}public static void main(String[] args) {ServerThread t new ServerThread();t.start();...t.exit true; //修改标志位退出线程}}2. 使用 stop() 终止线程通过查看 JDK 的 API我们会看到 java.lang.Thread 类型提供了一系列的方法如 start()、stop()、resume()、suspend()、destory()等方法来管理线程。但是除了 start() 之外其它几个方法都被声名为已过时(deprecated)。虽然 stop() 方法确实可以停止一个正在运行的线程但是这个方法是不安全的而且该方法已被弃用最好不要使用它。JDK 文档中还引入用一篇文章来解释了弃用这些方法的原因《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?》为什么弃用stop调用 stop() 方法会立刻停止 run() 方法中剩余的全部工作包括在 catch 或 finally 语句中的并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获)因此可能会导致一些清理性的工作的得不到完成如文件数据库等的关闭。调用 stop() 方法会立即释放该线程所持有的所有的锁导致数据得不到同步出现数据不一致的问题。例如存在一个对象 u 持有 ID 和 NAME 两个字段假如写入线程在写对象的过程中只完成了对 ID 的赋值但没来得及为 NAME 赋值就被 stop() 导致锁被释放那么当读取线程得到锁之后再去读取对象 u 的 ID 和 Name 时就会出现数据不一致的问题如下图3. 使用 interrupt() 中断线程现在我们知道了使用 stop() 方式停止线程是非常不安全的方式那么我们应该使用什么方法来停止线程呢答案就是使用 interrupt() 方法来中断线程。需要明确的一点的是interrupt() 方法并不像在 for 循环语句中使用 break 语句那样干脆马上就停止循环。调用 interrupt() 方法仅仅是在当前线程中打一个停止的标记并不是真的停止线程。也就是说线程中断并不会立即终止线程而是通知目标线程有人希望你终止。至于目标线程收到通知后会如何处理则完全由目标线程自行决定。这一点很重要如果中断后线程立即无条件退出那么我们又会遇到 stop() 方法的老问题。事实上如果一个线程不能被 interrupt那么 stop 方法也不会起作用。我们来看一个使用 interrupt() 的例子public class InterruptThread1 extends Thread{public static void main(String[] args) {try {InterruptThread1 t new InterruptThread1();t.start();Thread.sleep(200);t.interrupt();} catch (InterruptedException e) {e.printStackTrace();}}Overridepublic void run() {super.run();for(int i 0; i 200000; i) {System.out.println(i i);}}}输出从输出的结果我们会发现 interrupt 方法并没有停止线程 t 中的处理逻辑也就是说即使 t 线程被设置为了中断状态但是这个中断并不会起作用那么该如何停止线程呢这就需要使用到另外两个与线程中断有关的方法了public boolean Thread.isInterrupted() //判断是否被中断public static boolean Thread.interrupted() //判断是否被中断并清除当前中断状态这两个方法使得当前线程能够感知到是否被中断了(通过检查标志位)。所以如果希望线程 t 在中断后停止就必须先判断是否被中断并为它增加相应的中断处理代码Overridepublic void run() {super.run();for(int i 0; i 200000; i) {//判断是否被中断if(Thread.currentThread().isInterrupted()){//处理中断逻辑break;}System.out.println(i i);}}输出结果for 循环在执行完成前就提前结束了在上面这段代码中我们增加了 Thread.isInterrupted() 来判断当前线程是否被中断了如果是则退出 for 循环结束线程。这种方式看起来与之前介绍的“使用标志位终止线程”非常类似但是在遇到 sleep() 或者 wait() 这样的操作我们只能通过中断来处理了。public static native void sleep(long millis) throws InterruptedExceptionThread.sleep() 方法会抛出一个 InterruptedException 异常当线程被 sleep() 休眠时如果被中断这会就抛出这个异常。(注意Thread.sleep() 方法由于中断而抛出的异常是会清除中断标记的。)
http://www.sadfv.cn/news/160448/

相关文章:

  • 网站建设与维护蒋勇从网站后台管理系统进入
  • 网站建设实训报告要求哪些网站是用php开发的
  • 三、网站开发使用软件环境商业网站的建设与制作
  • 做律师咨询网站西安建设用地规划查询网站
  • 企业形象网站用什么语言开发做网站成功
  • 网站制作设计报价iis搭建网站时
  • 魏县网站建设龙岩seo公司
  • 有字体设计网站亚马逊aws永久免费下载
  • 九台网站域名注册网站建设方案
  • 自己怎么注册网站金融集团网站模板
  • 彩票网站里的统计怎么做wordpress 3.7
  • 织梦网站开发兼职太原跨境电商
  • 网站建设自助建站制作营销策划方案目录
  • 网站到期域名怎么解决成都哪里有做网站建设的
  • 发外链的网址网站描述如何写利于优化
  • 网站模板工具信息流优化师怎么入行
  • 电子商务网站开发课程免费商用图片的网站
  • html视频网站模板怎么用ps做购物网站
  • 网站运营和推广零基础建网站
  • 网站开发涉及服务广州平面设计
  • 网站建设 百度云丹阳市住房建设管理局网站
  • 著名网站用什么语言做后台工商年报网上申报系统官网
  • 商务网站开发作业设计公司画册零感设计
  • 网站建设成本多少wordpress不会代码
  • 青岛网站优化河南核酸检测vip
  • 开发一个网站的步骤流程做网站 网站违法吗
  • 5G网站建设上海注册公司买新能源车
  • 深圳专业学校网站建设北京科技公司
  • 在线3d建模网站今天重大新闻50字
  • 苏州网站建站推广电商网站建设费用价格