1。 新建一个SingleThreadExecutor,用这种而不是用线程池的好处,就是不用管引用变量的线程,不用上锁,避免循环死锁
config.executorService = Executors.newSingleThreadExecutor();
2。 新建一个Runnable对象,执行execute方法,将runnable的内容引入这个线程中去执行
instance.singleExecutorService.execute(new Runnable() {
@Override
public void run() {
Bifrost.globalApplication.unregisterActivityLifecycleCallbacks(mActivityLifecycleCallbacks);
BFRuleMgr.getInstance().clearEnableRules();
if((BFNetworkMonitor.networkChangeReceiver != null) && (Bifrost.globalApplication != null)){
BFNetworkMonitor.unRegisterNetworkReceiver(Bifrost.globalApplication);
}
}
});
3。这个线程异于主线程,因此不会阻塞主线程的操作,但是也有缺点,主要表现在在非主线程中不能直接使用handler,和toast等跟UI有关的操作,如果要使用handler,必须先调用Looper.prepare(),和Looper.loop()方法,因为一个handler发送消息队列需要有一个已经定义好的looper,主线程已经定义好,因此可以不用。另外,同一个数据如arraylist等不能同时在两个线程中引用和修改,否则会出现线程间修改数据的冲突。解决办法有两种
(1)在主线程中,将耗时的操作抛入异步线程中,具体方法如上;
(2)在一部线程中,将代码抛入主线程中
获得一个主线程的handler
private static Handler mainHandler = new Handler(Looper.getMainLooper());
private void startRuleInMainLooper(final BFRule ruleObserver) {
if (Looper.myLooper() == Looper.getMainLooper()) {
ruleObserver.startRule(); //含有conditionName的rule,重新start
} else {
Bifrost.getMainHandler().post(new Runnable() {
@Override
public void run() {
ruleObserver.startRule();
}
});
}
}
如下定时器
Handler timeHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_TIME:
BFRuleMgr.getInstance().updateCurrentRules(BFConstant.CONDITION_TIME);
break;
}
super.handleMessage(msg);
}
};
*需要注意的是:
在异步线程中执行代码的时候,不能嵌套多层抛入,因为这样可能引起代码运行时序错乱,导致逻辑错误。*