74

Android-Java停止线程的方式

 6 years ago
source link: https://tryenough.com/android-stop-thread?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

线程中的任务执行完毕就会自动退出,但有时候我们希望提前退出线程,或者是线程中的任务是循环任务,不会自动执行完毕,这时候可以使用下列的方法使线程退出。

1.使用退出标志终止线程

在线程的run方法中使用一个标志来使任务结束:

public class ThreadSafe extends Thread {
    public volatile boolean exit = false; 
        public void run() { 
        while (!exit){
            //do something
        }
    } 
}

2.使用interrupt()方法终止线程

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

a.线程处于阻塞状态,如使用了sleep,同步锁的wait,socket的receiver,accept等方法时,会使线程处于阻塞状态。当调用线程的interrupt()方法时,系统会抛出一个InterruptedException异常,代码中通过捕获异常,然后break跳出循环状态,使线程正常结束。通常很多人认为只要调用interrupt方法线程就会结束,实际上是错的,一定要先捕获InterruptedException异常之后通过break来跳出循环,才能正常结束run方法。

public class ThreadSafe extends Thread {
    public void run() { 
        while (true){
            try{
                    Thread.sleep(5*1000);阻塞5妙
                }catch(InterruptedException e){
                    e.printStackTrace();
                    break;//捕获到异常之后,执行break跳出循环。
                }
        }
    } 
}

b.线程未进入阻塞状态,使用isInterrupted()判断线程的中断标志来退出循环,当使用interrupt()方法时,中断标志就会置true,和使用自定义的标志来控制循环是一样的道理。

public class ThreadSafe extends Thread {
    public void run() { 
        while (!isInterrupted()){
            //do something, but no tthrow InterruptedException
        }
    } 
}

因为当阻塞状态时,如果有interrupt()发生,系统除了会抛出InterruptedException异常外,还会调用interrupted()函数,调用时能获取到中断状态是true的状态,调用完之后会复位中断状态为false,所以异常抛出之后通过isInterrupted()是获取不到中断状态是true的状态,从而不能退出循环,因此在线程未进入阻塞的代码段时是可以通过isInterrupted()来判断中断是否发生来控制循环,在进入阻塞状态后要通过捕获异常来退出循环。因此使用interrupt()来退出线程的最好的方式应该是两种情况都要考虑:

public class ThreadSafe extends Thread {
    public void run() { 
        while (!isInterrupted()){ //非阻塞过程中通过判断中断标志来退出
            try{
                Thread.sleep(5*1000);//阻塞过程捕获中断异常来退出
            }catch(InterruptedException e){
                e.printStackTrace();
                break;//捕获到异常之后,执行break跳出循环。
            }
        }
    } 
}

3.使用stop方法终止线程

程序中可以直接使用thread.stop()来强行终止线程,但是stop方法是很危险的,就象突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,不安全主要是:thread.stop()调用之后,创建子线程的线程就会抛出ThreadDeatherror的错误,并且会释放子线程所持有的所有锁。一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在调用thread.stop()后导致了该线程所持有的所有锁的突然释放(不可控制),那么被保护数据就有可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。因此,并不推荐使用stop方法来终止线程。

热度: 4


Recommend

  • 104
    • Github github.com 7 years ago
    • Cache

    Java 线程池的正确打开方式

    Java 线程池的正确打开方式

  • 24
    • www.cnblogs.com 5 years ago
    • Cache

    多线程的四种实现方式

    JDK5.0之后Java多线程的实现方式变成了四种,下面来简单的列举一下,如果需要更深入的了解,强烈建议阅读一下源码。 一、继承Thread类重写run()方法: 1. 创建一个继承于Thread类的子类 2. 重写Thread类的run()...

  • 26

    根据摩尔定律所说:集成电路上可容纳的晶体管数量每 18 个月翻一番,因此 CPU 上的晶体管数量会越来越多。 但随着时间的推移,集成电路上可容纳的晶体管数量已趋向饱和,摩尔定律也渐渐失效,因此多核 CPU 逐渐变为主流,与之相对应的多线程编程也开始变...

  • 6
    • www.androidchina.net 4 years ago
    • Cache

    Android多线程的四种方式

    Android多线程的四种方式 – Android开发中文站当我们启动一个App的时候,Android系统会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread。通常一个应用的所有组件都运行在这一个Process中,当然,你可以通过修改四大组件在Manifest...

  • 7

    Java线程池中三种方式创建 ThreadFactory 设置线程名称文章>Java线程池中三种方式创建 ThreadFactory 设置线程名称Java线程池中三种方式创建 ThreadFactory 设置线程名称

  • 7
    • segmentfault.com 3 years ago
    • Cache

    线程的创建方式、安全、状态

    今天我们来聊聊多多线程多线程创建方式通过继承Thread创建通过接口Runnable创建同步代码块Lock锁Thread与Runnable 创建Thread publ...

  • 4

    海量数据下,如何使用多线程的方式导出 Excel-51CTO.COM 海量数据下,如何使用多线程的方式导出 Excel 2022-02-09 18:28:46 公司项目最近有一个需要:报表导出。整个系统下来,起码超过一百张报...

  • 2

    activemq多线程消费的不同处理方式 发表于 2018-09-16...

  • 3
    • yang295513.github.io 3 years ago
    • Cache

    停止线程的方式

    方式一使用stop暴力停止 注意该方式以经被弃用,因为它有很大弊端 public class Thread04 { public static void main(String[] args) { MyThread04 myThread = new MyThread...

  • 1
    • benpaodewoniu.github.io 2 years ago
    • Cache

    java | 线程池停止

    关闭线程池。 shutdown 线程池状态变为 SHUTDOWN 不会接收新任务 但是已提交的任务会执行完 此方法不会阻塞调用线程的执行 void shutdown()

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK