java多线程——正确停止线程

一、什么时候需要立即停止线程

比如:做Android APP开发,当打开一个界面时,需要开启线程请求网络获取界面的数据,但有时候由于网络特别慢,用户没有耐心等待数据获取完成就将界面关闭,此时就应该立即停止线程任务,不然一般会内存泄露,造成系统资源浪费,如果用户不断地打开又关闭界面,内存泄露会累积,最终导致内存溢出,APP闪退。

参考:https://www.jianshu.com/p/264d4e1b76af

 

 

二、正确停止线程的步骤:

1.调用Thread对象的interrupt函数

  • 并不是立即中断线程,只是将线程中断状态标志设置为true,
  • 当线程运行中有调用其阻塞的函数(Thread.sleep,Object.wait,Thread.join等)时,阻塞函数调用之后,会不断地轮询检测中断状态标志是否为true,
  • 如果为true,则停止阻塞并抛出InterruptedException异常,同时还会重置中断状态标志;
  • 如果为false,则继续阻塞,直到阻塞正常结束。

2.判断线程是否处于停止状态thread.interrupted()

3.抛中断异常throw new InterruptedException() 或者调用sleep/wait等阻塞函数

 

备注:调用Thread对象的interrupt函数并不是立即中断线程,只是将线程中断状态标志设置为true

所以调用该中断函数后,应该判断线程是否除了停止状态,之后抛中断异常,停止线程

 

public class MyThread extends Thread {
    private int i;

    public MyThread(int i) {
        super();
        this.i = i;
    }

    public MyThread() {
    }

    @Override
    public void run() {
        super.run();

        while (!Thread.currentThread().isInterrupted()){
            System.out.println("---doing work----");
        }

        try {

            //抛异常方法一:
//            Thread.sleep(1000); //会拋一个异常

            //抛异常方法二:手动抛异常
            for(int i=0;i<100;i++){
                System.out.println("已经停止了!准备退出");
                throw new InterruptedException();
            }
        } catch (InterruptedException e) {
            System.out.println("----进入MyThread类的run方法的异常catch了----");
            e.printStackTrace();
        }

        System.out.println("------done work------");
    }
}




public static void myInterruptTest(){
        try {
            MyThread myThread = new MyThread();
            myThread.start();
            Thread.sleep(2000);
            myThread.interrupt();
        } catch (InterruptedException e) {
            System.out.println("---main catch-----");
            e.printStackTrace();
        }
        System.out.println("===main func end======");
    }

 

你可能感兴趣的:(java)