java中的线程(2):如何正确停止线程之2种常见停止方式
1.常见停止方式
- 结束run函数,run中含退出标志位。
- 使用interrupt()方法中断线程
- 使用stop方法暴力终止(已经弃用)
2.结束run
class TestThread extends Thread{
volatile boolean flag = true;
@Override
public void run() {
while (!flag){
Log.d(TAG, "running ....");
}
Log.d(TAG, "thread " + getId() + " finished !");
Log.d(TAG, "isAlive " + isAlive());
}
public void stopThread(){
flag = false;
}
}
TestThread testThread;
void stopThread(){
Log.d(TAG, "stopThread: isAlive : " + testThread.isAlive());
Log.d(TAG, "stopThread: isInterrupted : " + testThread.isInterrupted());
testThread.stopThread();
Log.d(TAG, "stopThread: isAlive : " + testThread.isAlive());
Log.d(TAG, "stopThread: isInterrupted : " + testThread.isInterrupted());
}
- 调用testThread.stopThread就可以了。
- 使用场景无限制
3.使用interrupt()方法
3.1示例
class TestThread extends Thread{
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()){
Log.d(TAG, "running .... interrupt = " + this.isInterrupted());
try {
Thread.sleep( * );
} catch (InterruptedException e) {
e.printStackTrace();
Log.d(TAG, "InterruptedException interrupt is reset = " + this.isInterrupted());
// Thread.sleep()方法由于中断抛出异常。
// Java虚拟机会先将该线程的中断标识位清除,然后抛出InterruptedException,
// 因为在发生InterruptedException异常的时候,会清除中断标记
// 如果不加处理,那么下一次循环开始的时候,就无法捕获这个异常。
// 故在异常处理中,再次设置中断标记位
Thread.currentThread().interrupt();
}
}
Log.d(TAG, "thread " + getId() + " finished !");
Log.d(TAG, "isAlive " + isAlive());
}
}
TestThread testThread;
void stopThread(){
Log.d(TAG, "stopThread: isAlive : " + testThread.isAlive());
Log.d(TAG, "stopThread: isInterrupted : " + testThread.isInterrupted());
testThread.interrupt();
Log.d(TAG, "stopThread: isAlive : " + testThread.isAlive());
Log.d(TAG, "stopThread: isInterrupted : " + testThread.isInterrupted());
}
3.1使用场景
适合线程处于阻塞状态,如使用了sleep,同步锁的wait,socket中的receiver,accept等方法时。
当调用阻塞线程的interrupt()方法时,会抛出InterruptException异常。通过代码捕获该异常,然后跳出循环状态,从而让我们有机会结束这个线程的执行。
调用interrupt方法后线程并不一定会结束, 只有捕获InterruptedException异常之后跳出循环,才能正常结束run方法。
4.Thread.stop()
已经弃用
http://www.cnblogs.com/sjjg/p/7625571.html
java中的线程(2):如何正确停止线程之2种常见停止方式的更多相关文章
- java中的线程(2):如何正确停止线程之3种常见停止方式
1.常见停止方式 自定义线程,其中含退出标志位,在run中判断它. 使用interrupt()方法中断线程 使用stop方法暴力终止(已经弃用) 2.使用标志位 class TestThread ex ...
- Java中的线程
http://hi.baidu.com/ochzqvztdbabcir/item/ab9758f9cfab6a5ac9f337d4 相濡以沫 Java语法总结 - 线程 一 提到线程好像是件很麻烦很复 ...
- Java中的线程Thread总结
首先来看一张图,下面这张图很清晰的说明了线程的状态与Thread中的各个方法之间的关系,很经典的! 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口. 要注意的是Threa ...
- 浅谈利用同步机制解决Java中的线程安全问题
我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...
- 第9章 Java中的线程池 第10章 Exector框架
与新建线程池相比线程池的优点 线程池的分类 ThreadPoolExector参数.执行过程.存储方式 阻塞队列 拒绝策略 10.1 Exector框架简介 10.1.1 Executor框架的两级调 ...
- Java多线程编程(1)--Java中的线程
一.程序.进程和线程 程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码.它本身没有任何运行的含义,它只是一个静态的实体,它可能只是一个单纯的文本文件,也有可能是经过编译之后生成的可执行文 ...
- 浅析Java中的线程池
Java中的线程池 几乎所有需要异步或并发执行任务的程序都可以使用线程池,开发过程中合理使用线程池能够带来以下三个好处: 降低资源消耗 提高响应速度 提高线程的可管理性 1. 线程池的实现原理 当我们 ...
- Java中的线程到底有哪些安全策略
摘要:Java中的线程到底有哪些安全策略呢?本文就为你彻底分析下! 本文分享自华为云社区<[高并发]线程安全策略>,作者:冰 河 . 一.不可变对象 不可变对象需要满足的条件 (1)对象创 ...
- [译]线程生命周期-理解Java中的线程状态
线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...
随机推荐
- PAT甲级——A1094 The Largest Generation
A family hierarchy is usually presented by a pedigree tree where all the nodes on the same level bel ...
- Axure中表格使用的技巧
对于新手来说,用Axure做一个表格是一件麻烦的事情.本文教你如何快速学会Axure表格的基础应用. (1)Axure制作基本表格的使用 可以使用“线框图”中的“表格”控件来制作一些简单的表格,同时A ...
- Java+微信支付(下预购单+回调+退款+查询账单)
前言: 现在的APP的离不开微信支付, 现在项目里接入微信支付 , 微信支付的官方文档是:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chap ...
- 解析Request和Response
简介: Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应 ...
- 在Linux中使用selenium(环境部署)
1.安装chrome 用下面的命令安装Google Chrome yum install https://dl.google.com/linux/direct/google-chrome-stable ...
- JSOI 2016 扭动的字符串
JSOI 2016 扭动的字符串 题面描述 给出两个长度为\(n\)的字符串\(A,B\) \(S(i,j,k)\)表示把\(A\)中的\([i,j]\)和\(B\)中的\([j,k]\)拼接起来的字 ...
- js实现事件委托
事件委托的概念: 事件委托就是利用事件冒泡,把事件加到父元素或祖先元素上,触发执行效果. 事件委托的写法: btn6.onclick = function(event){ event = event ...
- php函数基础(一)
一.函数结构 1.构成部分: 关键字 function
- PAT甲级——A1065 A+B and C (64bit)
Given three integers A, B and C in [−], you are supposed to tell whether A+B>C. Input Specificati ...
- Chapter 2 栈和队列
Chapter 2 栈和队列 1- 栈 当n个元素以某顺序进栈,可在任意时刻出栈,元素排列的顺序N满足Catalan()规则: 常用操作: 1 栈的初始化和定义: 2 元素x进栈: 3 ...