android 如何结束一个线程?


  如何结束一个线程?html

 

关于线程的结束有如下几点:java

1.不要手动调用stop方法强行终止一个线程,这种方式不安全。android

经过帮助文档,咱们能够知道,Android的线程类自己就提供一些公共方法去结束线程api

final void  stop()安全

This method is deprecated. because stopping a thread in this manner is unsafe and can leave your application and the VM in an unpredictable stateapp

 可是,经过说明咱们能够看到,这些方法Android自己都是不推荐使用的,经过这种方式结束线程是不安全的。异步

2.线程里run函数短,执行完后线程会自行销毁,不用手动去终止。ide

3.手动中止,经过在run里设置标志先中止运行,再调用Thread.interrupt();注意,在run没有中止时调用.interrupt()没有效果。函数

android中关闭线程的的三种方法教程详解
性能

1. 本身加入一个成员变量, 咱们在程序的循环里面, 轮流的去检查这个变量,  变量变化时,就会退出这个线程. 代码示例以下


  1. package  com.test;

  2. public class StopThread extends  Thread {

  3.     private boolean  _run  = true;
  4.     public void stopThread( boolean  run) {
  5.          this ._run = !run;
  6.     }
  7.     
  8.     @Override
  9.    public void  run() {
  10.         while(_run) {
  11.            
  12.           //[img]http://www.blogjava.net/Images/dot.gif[/img]数据处理
  13.          
复制代码
2. 方法1 虽然能够能够处理好, 不过, 在有阻塞线程的语句的时候每每不能处理好. 好比, 设计到Socket的阻塞语句. 虽然java有提供异步io可是异步io是在程序里不断去查询有没有消息的, 因此耗电量可想而知, 对手机这种设备来讲每每不适用.

那么阻塞的语句,怎么终止线程呢?

Java虽然deprecate了一个stop,可是,提供了interrupt(),这个方法是安全的.  这个中断方法能够将阻塞的线程唤醒过来, 可是注意 他不能将非阻塞的线程中断. 中断的同时,会抛出一个异常InterruptedException. 幸运的是, SocketChannel.connect() .read() 阻塞方法都会接受中断,ClosedByInterruptException.

这时咱们不轮询变量了, 轮询当前线程是否被中断, 代码

  1.             System.out.println("start");
  2.            while(!this.isInterrupted()) {
  3.                 [img]http://www.blogjava.net/Images/dot.gif[/img]数据处理
  4.              
  5.                      
  6. }
  7.         }catch (Exception e) {
  8.             e.printStackTrace();
  9.         }
  10.         System.out.println(stop);
  11.        super.run();
  12.    }

  13.     public static void main(String[] args) {
  14.         StopThread thread=new StopThread();
  15.         thread.start();
  16.        try {
  17.             Thread.sleep(1000);
  18.         }catch (InterruptedException e) {
  19.             e.printStackTrace();
  20.         }
  21.         
  22.         thread.interrupt();
  23.         System.out.println(interrupt);
  24.     }
  25. }
复制代码
3. Android 在本身的Api中加入了,Process类, 这个类能够直接终结进程, 也就是当前线程所在的JVM. 
final static void killProcess(int pid)  其中,pid, 能够经过Process.mypid() 获取, 但这样终结的是整个程序, 不是咱们所想要的.

==================================================分割线==========================================

若是该线程处在不可中断状态下,就是没有调用上述api,那么java只是设置一下该线程的interrupt状态,其余事情都不会发生,若是该线程以后会调用行数阻塞API,那到时候线程会马会上跳出,并抛出InterruptedException,接下来的事情就跟第一种情况一致了。若是不会调用阻塞 API,那么这个线程就会一直执行下去。除非你就是要实现这样的线程,通常高性能的代码中确定会有wait(),yield()之类出让cpu的函数,不会发生后者的状况。

  1. readCacheThread = new Thread(){
  2.                 public void run() {
  3.                     
  4.                     try {
  5.                         Method getPackageSizeInfo = pm.getClass().getMethod(
  6.                                 "getPackageSizeInfo", String.class,
  7.                                 IPackageStatsObserver.class);
  8.                         for (AppInfoItem item : installedApp) {//我的应用
  9.                             sleep(1);//interrupt后会抛异常,这样就能够提早结束线程
  10.                             getPackageSizeInfo.invoke(pm, item.packageName, pkgsizeobserver);
  11.                         }
  12.                         for (AppInfoItem item : systemApp) {//系统应用
  13.                             sleep(1);
  14.                             getPackageSizeInfo.invoke(pm, item.packageName, pkgsizeobserver);
  15.                         }
  16.                         
  17.                     } catch (Exception e) {
  18.                         // TODO: handle exception
  19.                         e.printStackTrace();
  20.                         Log.e("qqqqqqqqqqqqq", "sleep over");
  21.                         return;
  22.                     }
  23.                     
  24.                 };
  25.             };
  26.             readCacheThread.start();
复制代码
在须要中断线程的地方调用:

  1. if(readCacheThread != null && readCacheThread.isAlive()){
  2.                 //Log.e("readCacheThread", "thread interrupt_1");
  3.                 readCacheThread.interrupt();
  4.                 //Log.e("status", ""+readCacheThread.isInterrupted());
  5.             }
复制代码
(用判断readCacheThread.isInterrupted()方法会失败,由于总是返回false,不知道为何。因此只能用sleep()而后捕获异常再退出)。
这样即可提早退出一个线程。
相关文章
相关标签/搜索