android多线程之二:终止线程的三种方法

有三种方法可以终止线程:

一.使用退出标志位

使用退出标志位,使线程正常退出,也就是当run方法完成后线程终止。


有时候为了完成一些需要重复执行的任务,如服务器监听客户端的请求,会在线程的run方法中使用while(true){……}来处理,但要想使while循环在某一特定条件下退出,最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出,例子:

public class ThreadFlag extends Thread
{
    public volatile boolean exit = false;

    public void run()
    {
        while (!exit);
    }
    public static void main(String[] args) throws Exception
    {
        ThreadFlag thread = new ThreadFlag();
        thread.start();
        sleep(5000); // 主线程延迟5秒
        thread.exit = true;  // 终止线程thread
        thread.join();
        System.out.println("线程退出!");
    }
}

在上面代码中定义了一个退出标志exit,当exit为true时,while循环执行,exit的默认值为false.在定义exit时,使用了一个Java关键字volatile,这个关键字的目的是使exit同步,也就是说在同一时刻只能由一个线程来修改exit的值,

二.使用stop方法终止线程

使用stop方法可以强行终止正在运行或挂起的线程。我们可以使用如下的代码来终止线程:

thread.stop();

虽然使用上面的代码可以终止线程,但使用stop方法是很危险的,就象突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,因此,并不推荐使用stop方法来终止线程。

三.使用interrupt方法终止线程

使用interrupt方法来终端线程可分为两种情况:

1.线程处于堵塞状态,

如使用了sleep方法,这时候如果使用interrupt方法,会抛出InterruptedException异常,所以捕捉这个异常来退出线程:

public class ThreadInterrupt extends Thread
{
    public void run()
    {
        try
        {
            sleep(50000);  // 延迟50秒
        }
        catch (InterruptedException e) //2.捕捉InterruptedException
        {
            System.out.println(e.getMessage());
            return; //3.退出线程
        }
    }
    public static void main(String[] args) throws Exception
    {
        Thread thread = new ThreadInterrupt();
        thread.start();
        thread.interrupt();  //1.使用interrupt方法
        thread.join();
        System.out.println("线程已经退出!");
    }
}
2.线程处于非堵塞状态,

在线程的run方法中判断while(!isInterrupted()){……}:

public class ThreadInterrupt extends Thread
{
    public void run()
    {
       while(!isInterrupted())
       {
	……
       }
    }
    public static void main(String[] args) throws Exception
    {
        Thread thread = new ThreadInterrupt();
        thread.start();
        thread.interrupt();
        thread.join();
        System.out.println("线程已经退出!");
    }
}

注意:在Thread类中有两个方法可以判断线程是否通过interrupt方法被终止。一个是静态的方法interrupted(),一个是非静态的方法isInterrupted()
这两个方法的区别是interrupted用来判断当前线是否被中断,而isInterrupted可以用来判断其他线程是否被中断。


因此,while (!isInterrupted())也可以换成while (!Thread.interrupted())

补充:Thread类中interrupt()、interrupted()和isInterrupted()方法详解https://blog.csdn.net/qq_39682377/article/details/81449451

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于框架有意见 欢迎联系我一起探讨。 问答是happy http://blog.csdn.net/b275518834/article/details/8247685 操作方式:输入文本框设置线程数 点击第一个按钮请求10个地址信息 点击第二个按钮中断10个地址信息 1:判断当前网络环境 2:编写了3套方案 Old_GridViewActivity 简单线程回调 AsyncTask_GridViewActivity 使用android自带的AsyncTask类实现 Demo_GridViewActivity 队列任务管理 线程控制 Demo_GridViewActivity方式 1:队列优先级 (如果想要listview中移动的区域优先被显示,而不是从上到下显示图片,可以把新建的任务提到任务队列前端) 2:实现了:中断任务的功能(比如进入一个Activity会开启大量任务,如果退出这个Activity 则应该停止此Activity中驻留的任务) 3:为何采用drawable不用bitmap bitmap优点是位图运算效率优秀 但drawable的存储体积比bitmap小 4:如果任务被起名字则禁止重复提交任务 (避免某些请求未处理完又被创建) 5:先执行缓存数据后执行请求数据 (缓存性能) 6:使用状态模式 观察者模式更好的处理多线程 最初的想法:网络优化开发框架 (移除任务未完成) 网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性 (旧的系统症结所在) 开启过多线程,导致系统频繁切换多个线程,导致处理速度过慢,经常出现未响应。 代码经常写的换繁多无序,维护困难。 使用类似银行叫号系统 线程池内等待网络请求的任务=(排队的人) 最大三个线程=(银行柜台处理业务的窗口) 依次处理任务=(将排队的人依次被叫到处理的号,完成业务的窗口叫号后面排队的人) 如果抛出异常则通知相关单位=(如果银行柜台处理不了一个人的业务就打电话给大堂经理) 设置柜台的监听回调=(A委托B去银行请求数据,当B去银行处理业务失败了,通知A。) 设置撤销机制和线程安全= 某机关让A和B去银行申请业务,A在排队,B正在柜台处理业务,此时机关打来电话说, 这申请业务的需求现在不做,A取消排队,B也‘礼貌的退出’ 《例如退出A页面时,终止A页面所有的请求》 任务状态标示-还没处理 处理中 处理结束 处理异常 (有结果但不通知)=(排队人的状态) 任务名 排队人的名字 强制退出 强制退出 抛出强制退出的异常

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值