1.常见停止方式

  • 自定义线程,其中含退出标志位,在run中判断它。
  • 使用interrupt()方法中断线程
  • 使用stop方法暴力终止(已经弃用)

2.使用标志位

     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. * );
                 } 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):如何正确停止线程之3种常见停止方式的更多相关文章

  1. java中的线程(2):如何正确停止线程之2种常见停止方式

    1.常见停止方式 结束run函数,run中含退出标志位. 使用interrupt()方法中断线程 使用stop方法暴力终止(已经弃用) 2.结束run class TestThread extends ...

  2. Java中的线程

    http://hi.baidu.com/ochzqvztdbabcir/item/ab9758f9cfab6a5ac9f337d4 相濡以沫 Java语法总结 - 线程 一 提到线程好像是件很麻烦很复 ...

  3. Java中的线程Thread总结

    首先来看一张图,下面这张图很清晰的说明了线程的状态与Thread中的各个方法之间的关系,很经典的! 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口. 要注意的是Threa ...

  4. 浅谈利用同步机制解决Java中的线程安全问题

    我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...

  5. 第9章 Java中的线程池 第10章 Exector框架

    与新建线程池相比线程池的优点 线程池的分类 ThreadPoolExector参数.执行过程.存储方式 阻塞队列 拒绝策略 10.1 Exector框架简介 10.1.1 Executor框架的两级调 ...

  6. Java多线程编程(1)--Java中的线程

    一.程序.进程和线程   程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码.它本身没有任何运行的含义,它只是一个静态的实体,它可能只是一个单纯的文本文件,也有可能是经过编译之后生成的可执行文 ...

  7. 浅析Java中的线程池

    Java中的线程池 几乎所有需要异步或并发执行任务的程序都可以使用线程池,开发过程中合理使用线程池能够带来以下三个好处: 降低资源消耗 提高响应速度 提高线程的可管理性 1. 线程池的实现原理 当我们 ...

  8. Java中的线程到底有哪些安全策略

    摘要:Java中的线程到底有哪些安全策略呢?本文就为你彻底分析下! 本文分享自华为云社区<[高并发]线程安全策略>,作者:冰 河 . 一.不可变对象 不可变对象需要满足的条件 (1)对象创 ...

  9. [译]线程生命周期-理解Java中的线程状态

    线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...

随机推荐

  1. 简单的Cooki案例——记录用户上次访问该网页的时间

    功能: 帮助网站实现提示客户端计算机上次访问网站的时间 实现原理: 将每一个会话作为一次访问过程,将每次会话的开始时间作为每次访问网站的时间,然后将这个时间以Cookie的形式存储到客户端的计算机中, ...

  2. 编写javascript的基本技巧一

    自己从事前端编码也有两年有余啦,时间总是比想象中流逝的快.岁月啊,请给我把时间的 脚步停下吧.不过,这是不可能的,我在这里不是抒发时间流逝的感慨.而是想在这分享两 年来码农生活的一些javascrip ...

  3. 关于在jeecms中css,图片,html,模板是如何组装成——part2

    这是index.html折叠后的代码可以看出4部分:header+div+footer+right-fixed 好,先解决自己的第一个疑问,home.css是如何让一个巨丑无比的老汉子,变为年少的小欧 ...

  4. XE下 SVG格式的图标使用方法

    下载一个SVG格式的图标,千图网,http://tool.58pic.com/tubiaobao/ 用txt文本打开SVG图标 拖一个PathLabel控件 在PathLabel控件的Data属性添加 ...

  5. 【转】微信中MMAlert(半透明底部弹出菜单)的使用介绍

    原文地址:http://blog.csdn.net/singwhatiwanna/article/details/8892930 果大家时常用过微信或者用过iphone,就会发现有种从底部弹出的半透明 ...

  6. CRC-32 校验算法

      crc32的头文件 ===========================分割线=========================== //crc32.h #ifndef _CRC32_H #de ...

  7. EF 完成指定数据迁移

    Update-Database -ConfigurationTypeName Bmw.Services.DealerService.WebApiHost.MigrationsOfDealerDB.De ...

  8. angular 基本依赖注入

    import { Injectable } from '@angular/core'; @Injectable() export class ProductServiceService { const ...

  9. raiden_graph

    使用mermaid描述 raiden 通道 AB,正常状态 graph LR A-- 60,100,S_100 ---B 通道 AB closed graph LR A((A)) -. 60,100 ...

  10. go语言 defer 你不知道的秘密!

    go 语言的defer功能强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.我们先来看几个例子. 例一: defer 是先进后出 这个很自然,后面的语句会依赖前面的资源,因此如果先前面的资源先 ...