实例分析Java终止线程和stop()方法
- 更新时间:2020-03-16 10:38:32
- 编辑:罗尔柳
参考资料
- JavaScript Web应用开发 PDF 电子书 / 12.6 MB / Nicolas Bevacqua 推荐度:
- 《深度学习:Java语言实现》源码 配套资源 / 12.41 MB / 巣笼悠辅 推荐度:
- JavaScript程序设计 PDF 电子书 / 47.3 MB / 卢淑萍 陈玲 推荐度:
- JavaScript编程精解(第3版) PDF 电子书 / 134 MB / 马尔奇·哈弗贝克(Marijn Have 推荐度:
- Java从入门到精通(第5版) PDF 电子书 / 82.5 MB / 明日科技 推荐度:
正文内容
Java终止线程实例和stop()方法源码阅读
了解线程
概念
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
线程特点
拥有状态,表示线程的状态,同一时刻中,JVM中的某个线程只有一种状态;
·NEW
尚未启动的线程(程序运行开始至今一次未启动的线程)
·RUNNABLE
可运行的线程,正在JVM中运行,但它可能在等待其他资源,如CPU。
·BLOCKED
阻塞的线程,等待某个锁允许它继续运行
·WAITING
无限等待(再次运行依赖于让它进入该状态的线程执行某个特定操作)
·TIMED_WAITING
定时等待(再次运行依赖于让它进入该状态的线程在指定等待时间内某个特定操作)
·TERMINATED
已退出的线程
拥有优先级,决定线程的执行顺序;
1至10之间的整数,默认数值为5。数值越高,执行的几率越高,优先级并不能决定线程的执行顺序。
子线程的优先级默认同父线程的一样。
注意,当以下情况发生时,JVM将停止执行所有线程:
Runtime(运行时)的exit ()方法被调用并且该方法的调用被Security Manager所允许;
所有的“非守护线程”都已停止运行(无论时正常停止还是一场停止);
可以被标记为守护程序(Daemon)
守护线程的子线程仍是守护线程;
守护线程也就是“后台线程”,一般用来执行后台任务,而用户线程一般用户执行用户级任务。
终止线程的方法
1.使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。如果想让循环永远运行下去,可以使用while(true){……}来处理。但要想使while循环在某一特定条件下退出,最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出。下面给出了一个利用退出标志终止线程的例子。
FlagExitThread.java
package com.rainmonth; /** * Created by RandyZhang on 2017/3/23. */ public class FlagExitThread extends Thread { public volatile Boolean isExit = false; public FlagExitThread(String name) { super(name); } @Override public void run() { while (!isExit) { System.out.println("I'm running"); } } }
DemoClient.java
package com.rainmonth; /** * Created by RandyZhang on 2017/3/23. */ public class DemoClient { public static void main(String[] args) { System.out.println("优雅的终止线程实例"); exitByFlag(); // exitByInterrupt(); } private static void exitByFlag() { FlagExitThread flagExitThread = new FlagExitThread(FlagExitThread.class.getSimpleName()); flagExitThread.start(); try { Thread.sleep(1000); flagExitThread.isExit = true; flagExitThread.join(); System.out.println("线程退出"); } catch (InterruptedException e) { e.printStackTrace(); } } private static void exitByInterrupt() { FlagExitThread flagExitThread = new FlagExitThread(FlagExitThread.class.getSimpleName()); System.out.println("flagExitThread running..."); flagExitThread.start(); try { Thread.sleep(1500); System.out.println("flagExitThread interrupted..."); flagExitThread.interrupt(); Thread.sleep(1500); System.out.println("stop application..."); } catch (InterruptedException e) { e.printStackTrace(); } } }
输出结果:
打印了一大堆I'm running之后线程退出。
2.使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
显示调用stop()方法。源码中关于stop() 的描述如下:
/* * This method is inherently unsafe. Stopping a thread with * Thread.stop causes it to unlock all of the monitors that it * has locked (as a natural consequence of the unchecked * <code>ThreadDeath</code> exception propagating up the stack). If * any of the objects previously protected by these monitors were in * an inconsistent state, the damaged objects become visible to * other threads, potentially resulting in arbitrary behavior. Many * uses of <code>stop</code> should be replaced by code that simply * modifies some variable to indicate that the target thread should * stop running. The target thread should check this variable * regularly, and return from its run method in an orderly fashion * if the variable indicates that it is to stop running. If the * target thread waits for long periods (on a condition variable, * for example), the <code>interrupt</code> method should be used to * interrupt the wait. */
大意就是说,该方法的不安全性时固有的。调用stop()终止一个线程会释放它已经锁定的所有监视器(这将导致沿堆栈向上传播为检查的ThreadDeath异常被抛出),若此时之前受这些被释放的监视器保护的对象存在不一致性,并且这些对象对其他线程可见,这就会导致一些意想不到的后果。stop操作应该有哪些仅仅只需要修改某些代码就可以指示目标线程应该停止运行的代码来取代(方法一就是这种方式)。如果目标线程由于等待某一条件(如某个条件变量)等待很长时间,我们应该使用interrupt方法来中断该等待(方法三就是这种方式)。
3.使用interrupt方法中断线程。
interrupt字面上是终止的意思,但不要试图通过调用interrupt来终止线程,因为有时即使你调用了该方法,线程仍然会继续执行,可以注释掉上面的exitByFlag(),开启exitByInterrupt() 方法,发现及时调用了interrupt()方法,仍在一直输出I'm running…(不同系统及CPU结果可能有所不同),可见采用interrupt方式也是不安全的。
总结
根据以上的分析,最值得推荐的方式是第一种,我们可以用共享变量(shared variable)的方式来设置标志,并发出信号,通知线程必须终止。当然对这个共享变量的操作我们必须保证是同步的。
以上就是本文关于Java终止线程实例和stop()方法源码阅读的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
Java相关教程
-
Java 超详细讲解对象的构造及初始化
面向对象乃是Java语言的核心,是程序设计的思想。Java语言的面向对象技术包括了面向对象和面向过程的基本概念,面向对象的特征,Java语言的类,对象,修饰符,抽象类等一系列的知识点
发布时间:2019-07-23
-
浅谈java对象结构 对象头 Markword
这篇文章主要介绍了浅谈java对象结构 对象头 Markword,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
发布时间:2021-05-02
-
Java学习指南
《Java学习指南(第4版)(上、下册)》 是畅销Java学习指南的最新版,详细介绍了Java 6和Java 7的语言特性和API。本书全面介绍了Java的基础知识,力图通过完备地介绍Java语言、其类库、编程技术以及
大小:179.5 MBJava电子书
-
移动网页设计与开发:HTML5+CSS3+JavaScript
将落伍的网址打导致更为灵便、友善,而且令其充分运用不一样机器设备和电脑浏览器的与众不同优点。根据《移动网页设计与开发HTML5+CSS3+JavaScript》,您将为投身第一线开发充分准备! *內容
大小:30.2 MB移动开发电子书
-
疯狂Java讲义(第4版)
10年经典原创读物,覆盖Java 8、Java 9,第4版保持了前3版系统、全面、讲解浅显、细致的特性,全面新增介绍了Java 9的新特性,从解决问题的角度来介绍Java语言,欢迎下载
大小:619 MBJava编程电子书
-
完美图解物联网IoT实操:ESP8266 Arduino,Cordova物联网移动App,JavaScript微控制器编程
完美图解物联网技术系列》图书是当前物联网开发技术应用的集大成者。本书内容以Arduino和JavaScript为主线,开发物联网应用、手机App和操控微电脑
大小:60.8 MB物联网电子书
-
Java Web应用程序开发
《企业级卓越人才培养(信息类专业集群)解决方案十三五规划教材:Javaweb应用程序开发》通过对JAVAweb相关知识的介绍,学习IO流、JDBC、Web服务器、JSP页面以及对JSP内置对象等内容,每个知识点后
大小:5.3 MBJava Web开发电子书
-
精通Java并发编程
Java 提供了一套非常强大的并发API,可以轻松实现任何类型的并发应用程序。本书讲述Java 并发API *重要的元素,包括执行器框架、Phaser 类、Fork/Join 框架、流API、并发数据结构、同步机制,并展
大小:200.7 MBJava电子书
-
Java入门经典(第7版)
大小:16.6 MBJava入门电子书
-
Java9模块化开发核心原则与实践
大小:112.3 MBJava9电子书
-
RxJava响应式编程
主要介绍如何使用RxJava进行响应式编程,从响应式编程与RxJava的概念,到RxJava的操作符和源码,以及各种Scheduler的特点和适用场景,均做了较细致的讲解,是架构师提升必备入门书籍
大小:71.1 MBRxJava电子书