终止线程 4 种方式
1、正常运行结束
程序运行结束,线程自动结束。
2、使用退出标志退出线程
一般 run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。使用一个变量来控制循环,例如: 最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while 循环是否退出,代码示例:
public class ThreadSafe extends Thread { public volatile boolean exit = false; public void run() { while (!exit){ //do something } }
}
定义了一个退出标志exit,当exit为true时,while循环退出,exit的默认值为false.在定义exit 时,使用了一个 Java 关键字 volatile,这个关键字的目的是使 exit 同步,也就是说在同一时刻只 能由一个线程来修改exit的值。
3、Interrupt 方法结束线程
使用interrupt()方法来中断线程有两种情况:
(1) 线程处于阻塞状态
如使用了 sleep,同步锁的 wait,socket 中的 receiver,accept 等方法时, 会使线程处于阻塞状态。当调用线程的 interrupt()
方法时,会抛出 InterruptException
异常。 阻塞中的那个方法抛出这个异常,通过代码捕获该异常,然后 break 跳出循环状态,从而让我们有机会结束这个线程的执行。通常很多人认为只要调用 interrupt 方法线程就会结束,实 际上是错的,一定要先捕获InterruptedException异常之后通过break来跳出循环,才能正常结束run方法。
(2)线程未处于阻塞状态
使用 isInterrupted()
判断线程的中断标志来退出循环。当使用 interrupt()方法时,中断标志就会置true,和使用自定义的标志来控制循环是一样的道理。
public class ThreadSafe extends Thread {public void run() {while (!isInterrupted()){ //非阻塞过程中通过判断中断标志来退出 try{ Thread.sleep(5*1000);//阻塞过程捕获中断异常来退出 }catch(InterruptedException e){ e.printStackTrace(); break;//捕获到异常之后,执行break跳出循环 } } }
}
4、stop 方法终止线程(线程不安全)
程序中可以直接使用 thread.stop()
来强行终止线程,但是stop方法是很危险的,就象突然关 闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,不安全主要是: thread.stop()
调用之后,创建子线程的线程就会抛出 ThreadDeatherror
的错误,并且会释放子 线程所持有的所有锁。一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在调用 thread.stop()
后导致了该线程所持有的所有锁的突然释放(不可控制),那么被保护数据就有可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。因 此,并不推荐使用stop方法来终止线程。
终止线程 4 种方式相关推荐
- Java的知识点30——线程的优先级、终止线程的典型方式、获取线程基本信息的方法
线程的优先级 1-10 1. NORM_PRIORITY 5 默认 2. MIN_PRIORITY 1 3. MAX_PRIORITY 10 注意:优先级低只是意味着获得调度的概率低.并不 ...
- java实现线程三种方式_详解三种java实现多线程的方式
java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...
- Qt创建线程两种方式的区别
使用QT创建线程有两种方式,方式A使用moveToThread,方式B是直接继承QThread.差异主要在于方式A的槽函数将会在新线程中运行,而方式B的槽函数在旧线程中运行. 结论如下: PS:旧线程 ...
- C# Thread开启线程几种方式
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 快点来学吧!java保证线程安全的方式
JAVA基础 JAVA异常分类及处理 异常分类 异常的处理方式 Throw和throws的区别 JAVA反射 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) Java反射API 反射使用 ...
- java线程方法_Java线程的三种方式
创建线程有三种方式: 1.继承Thread类 2.实现Runnable接口 3.使用Callable和Future创建线程 三种方式详解如下: ---------------------------- ...
- JAVA线程两种方法内存,JAVA线程基础回顾及内存模型(一)
线程创建的两种方式 继承Thread类 class MyThread extends Thread{ ...... @Override public void run(){ ...... } } My ...
- jar 退出run_Java终止线程的三种方式
停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作. 在 Java 中有以下 3 种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,也就是当 run() 方 ...
- pyqt stop停止线程_面试阿里,字节跳动,腾讯90%都会被问到如何终止线程?有几种方式?你都知道吗?...
在 Java 中有以下 3 种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程终止: 使用 stop() 方法强行终止线程,但是不推荐使用这个方法,因为 ...
最新文章
- 2018全球最强物联网公司榜单揭晓|20家企业物联网战略大起底!
- 使用CA和CCA克隆账户
- mysql配置参数调优(8GB内存和64GB内存)
- sklearn随笔-归一化(标准化)
- UVa 10375 - Choose and divide(唯一分解定理)
- linux系统的安全机制有哪些内容,系统安全机制
- 为什么没有看到webcontent_环卫工人工资低工作辛苦,为什么还有那么多人愿意做呢?...
- seo爬虫工具 php,爬虫工具有哪些(爬虫网页分析工具)
- 利用SCCM2012中的导入计算机功能来实现定制化的操作系统部署
- Shp数据批量导入Postgresql工具的原理和设计
- gitee创建ssh公钥
- Python学习之==接口开发
- mysql员工与部门代码,springMVC入门实例(员工系统-Mysql)代码简单易懂
- CCS(Code Composer Studio) 的下载、安装和导入工程
- linux备份数据库
- 2022年互联网寒冬,裁员消息频出,软件测试人员该如何破局?
- 应届生毕业第一份工资多少?
- 软件测试女生可以学习么?现在还能入行么?
- 【CSS 书写模式 (Writing modes )】
- 国美易卡RMAN客户端工具,国美易卡备份有效数据