Android正确关闭线程


1、正常关闭:推荐使用业务标志位结束线程的工作流程,待线程工作结束自行关闭, 如下 mWorking 进行控制线程的业务是否继续进行:
    /**     * start thread running     */    public void start() {        mWorking = true;        if (mThread != null && mThread.isAlive()) {            if (DEBUG) {                LogHelper.i(TAG, "start: thread is alive");            }        } else {            mThread = new Thread(new Runnable() {                @Override                public void run() {                    int interval = 1000 / FRAMES;                    while (mWorking) {                        moveCircularly();                        moveToPercent();                        postInvalidate();                        SystemClock.sleep(interval);                    }                    if (DEBUG) {                        LogHelper.i(TAG, "run: thread stopping");                    }                }            });            mThread.start();        }    }    /**     * stop thread running     */    public void stop() {        if (mWorking) {            mWorking = false;        }    }



2、暴力型(不推荐):一般不使用这种方法关闭线程,Thread.interrupt() 较暴力,虽然进行
mThread.interrupt();mThread = null;
终止了线程,但查看源码我们发现: interrupt() 使线程接受一个终端请求,接下来的线程操作有线程当前状态决定。
  • 线程在 wait(), join() 或 sleep() 状态下,它将被唤醒,被清除状态让后会收到一个InterruptedException的 Exception,线程中断 Exception 处理.结束工作。
  • 线程 blocked 在I/ O操作时,会接收ClosedByInterruptException。同样的,该信道将被关闭,线程结束工作。
  • 线程 blocked在Selector 时会立即中断重置状态 return。此情况下,不接收异常。




    /**     * start running     */    public void start() {        mWorking = true;        if (mThread != null && mThread.isAlive()) {            if (DEBUG) {                LogHelper.i(TAG, "start: thread is alive");            }        } else {            mThread = new Thread(new Runnable() {                @Override                public void run() {                    int interval = 1000 / FRAMES;                    while (mWorking) {                        moveCircularly();                        moveToPercent();                        postInvalidate();                        SystemClock.sleep(interval);                    }                }            });            mThread.start();        }    }    public void stop() {        if (mWorking) {            if (mThread != null && mThread.isAlive()) {                mThread.interrupt();                mThread = null;            }            mWorking = false;        }    }

其实,项目中会集成个性化的线程池,保证不开启过多的线程进行多线程操作(硬件层CPU 支持的核心数有限,过多的线程只能更加分割 cpu 时间片,无法达到更好的效果),也会有自己的新线程创建、管理和结束操作。 在工作中我们将Android Thread分两种线程进行管理,即 UI Thread (最多 Thread 数由 cpu 核心数决定)和 Bkg Thread (最大Thread数为1).
    private ThreadPoolExecutor mUiThreadPoolExecutor;    private ThreadPoolExecutor mBkgThreadPoolExecutor;
    private int getUiInitialThreadPoolSize() {        int cpuCores = Runtime.getRuntime().availableProcessors();        return Math.max(2, cpuCores / 2); // at least 2, or (cores/2)    }
 分别进行线程池管理       
我们只进行 addTask 进行ThreadFactory new adding thread. 而不强行进行 thread 的关闭处理,由线程业务结束自行结束线程。

先写到这里,更多关于线程方面的知识以后可以多多交流。

更多相关文章

  1. android 通信机制 socket
  2. Android主线程里不允许网络操作
  3. android Can't create handler inside thread that has not call
  4. android 连接服务器的方法及安全性问题
  5. android通过webservice验证用户
  6. UML详解:解析Android消息处理机制:Handler/Thread/Looper & Messag
  7. Android(安卓)关闭线程(转)
  8. android 连接服务器的方法及安全性问题
  9. Android使用AsyncTask下载图片,最好使用WeakReference

随机推荐

  1. 从.Net到Android之八:Android宏内核和微内
  2. Unity在Android和iOS中如何调用Native AP
  3. Android Studio自动排版格式化(android排
  4. 关于Android上的虚拟机(Kuix)
  5. Android基础 - Android(安卓)Studio 添加
  6. Android 4.0 ICS 用户界面概述
  7. Android 手势(Gesture)——手势检测
  8. Android移动应用界面的模板化设计【自定
  9. Android 适配问题分享和总结
  10. 硬核干货!系统盘点Android开发者必须掌握