Android -永久线程池

听着谢春花的《借我》。该曲也是小姑娘的成名曲。其中借我十年,借我亡命天涯的勇敢,借我说得出口的旦旦誓言...静看光阴荏苒,借我哑口无言,不管不顾不问不说,也不念。描述的是一个,想要打破自己现在庸碌的生活却没有勇气彻底颠覆自己现有的生活的,年轻人。他/她想要不管不顾地做事,不问他人的想法,不辩解的想法,也不再怀念过去那些庸碌平淡的生活。但是他/她对这种想法犹疑不决,甚至畏惧这种改变会给自己带来的颠覆。对这首歌喜爱的人大致也是有类似想法的年轻人吧!言归正传吧!
相信架构设计师遇见过这样的问题:某些activity、WindowManager、fragment所在的线程需要在一段是时间内一直在运行。比如:通话界面、显示数据动态改变的页面等。这时候我们需要一个永久的线程管理池。
1.第一步当然是展示永久线程池的文件--ThreadForeverManager.java

  • 1注册的执行函数中不可有耗时操作 (暂时不用)
  • 2一直存在的线程,如果需要执行某函数,请继承ThreadForever并向向 此ThreadForeverManager对象注册即可

public class ThreadForeverManager {
* 接口(需要利用线程的函数继承此接口)
/
public interface ThreadForever {
/
*
* 线程执行函数(50ms执行一次),一定不要在此线程中加入耗时操作
*/
public void doThread();
}

private static final String TAG = "ThreadForeverManager";
private static ThreadForeverManager sThreadForeverManager;

public static ThreadForeverManager getInstance() {
    if (sThreadForeverManager == null) {
        sThreadForeverManager = new ThreadForeverManager();
        Log.i(TAG, "常驻线程开启");
    }
    return sThreadForeverManager;
}

/** ThreadForever接口实现类对象结集合 */
private HashSet<ThreadForever> mThreadForeverSet = new HashSet<ThreadForever>();

/**
 * 注册
 */
public void register(ThreadForever threadForever) {
    if (threadForever == null) {
        return;
    }
    
    Log.i(TAG, "注册线程监听事件成功");
    synchronized (mThreadForeverSet) {
        mThreadForeverSet.add(threadForever); // 注册
    }
}
  
/**
 * 注销监听down事件
 */
public void cancel(ThreadForever threadForever) {
    synchronized (mThreadForeverSet) {
        if (mThreadForeverSet.remove(threadForever)) {
            Log.i(TAG, "注销线程监听事件成功");
        }
    }
}

/** 构造函数 并开启线程*/
private ThreadForeverManager() {
    new Thread() {
        public void run() {
            while (true) {
                synchronized (mThreadForeverSet) {
                    for (ThreadForever threadForever : mThreadForeverSet) {
                        threadForever.doThread();           //线程执行函数
                    }
                }
                
                delay(50);          // 50ms循环一次 
            }
        }  
    }.start();
}

/**
 * 延时
 */
private void delay(int m) {
    try {
        Thread.sleep(m);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

永久线程池中,具有包括类的对象注册、注销方法。在构造函数里面开启线程。类的对象存储采用的是HashSet集合。注册和销毁的时候都要保证线程同步。同时文件可以设计了一个回调接口--线程执行函数。开启线程时候也设置执行一次所需的时间。
2.第二部就是延时执行控制的类了,代码如下:
、、
public class DelayExecute {

public interface Execute{
    public void go();
}
/** 最后执行时间*/
private long lastTime;
private Execute mExecute;
private int delay;
public DelayExecute(int delay, Execute mExecute){
    if(delay < 0 || mExecute == null){
        throw new IllegalAccessError("DelayExecute  初始化异常, 参数不正确, delay = " + delay + " mExecute = " + mExecute);
    }
    this.mExecute  = mExecute;
    this.delay = delay;
}

/**
 * 外部线程中调用执行
 */
public void execute(){
    long currentTime = SystemClock.uptimeMillis();
    if (currentTime - lastTime > this.delay) {
        if (this.mExecute != null) {
            this.mExecute.go();
        }
        lastTime = currentTime;
    }
}

3.如何调用?只要集成永久线程池的类(ThreadForeverManager)实现回调接口。以及在相关的方法里面注册和销毁即可啦!
public void doThread() {
mDelayExecute.execute();
}
其中mDelayExecute为延时控制类的对象(DelayExecute),注册代码和销毁代码如下:
ThreadForeverManager.getInstance().register(FragmentContacts.this);
ThreadForeverManager.getInstance().cancel(FragmentContacts.this);
OK!借我一束光照亮黯淡,借我笑颜灿烂如春天,借我纵容的悲怆与哭喊!生活就是这样多姿多味。尝够了就长大了!
本文章非常感谢陈老大和郭老大技术的支持!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,288评论 19 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,422评论 11 349
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,831评论 25 709
  • 千万次的呼唤,换來这一片花语 【美】顧月華 孙林,美藉华人画家, 1963年于上海戏剧学院舞台美术系学士,曾长期从...
    顾月华的书页阅读 21,007评论 1 2