Android可以让主线程在其他子线程执行完后再执行吗?如果可以,该怎么做?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android可以让主线程在其他子线程执行完后再执行吗?如果可以,该怎么做?相关的知识,希望对你有一定的参考价值。
android中什么时候会选择用广播来进行线程间的通信 Android 多线程 通信线程中通信就不要用广播了吧 进程中通信可以用广播或者aidl可是,这两天看到的项目都是这么做的;然后,自己分析了下,觉得一下的理由也是可以成立的;1.正常情况下我们选择handler消息机制来进行单向的线程间的通信;(工作线程向主线程发送消息)因为主线程有现成的handler,而工作线程没有现成的handler,这样的话,主线程将handler交给工作线程而让工作线程将工作的结果交给主线程;相反,工作线程中没有现成的handler(事实上是没有消息队列,也就是handler没有绑定到工作线程),那么,如果开辟的话,代码角度上是挺麻烦的(相对应广播机制来说);2.广播机制本身就是双向的(工作线程向主线程发送广播,主线程向工作线程发送广播);//另外,对于像一个activity中通过fragment来进行界面的处理; 我们大多数情况下是采用广播的机制来实现fragment中adapter的数据的更新;这样做主要是考虑到工作线程的任务加载完成,而具体的对应刷新的activity可能还没有启动;另外,基于接口隔离原则,如果用handler进行通信的话,则不能很好的满足这一原则;你要是周期比较长 用广播好些吧应该与周期关系不是很密切。最主要的原因是两条线成是双向通信。Handler类似于P2P的通信。广播则类似于一个server端,用来处理分发不同线程的请求,从控制器的角度来说用广播更好一点。一般使用Handler的,多用于子线程处理事务,完成时告知主线程这一类的情况。而类似楼主所说的多条线程之间需要频繁交互的话,广播是个很好的选择,并且结构清晰,只是不知道广播的性能与handler相比会怎么样。 参考技术A 可以在主线程中设置一个标志位,也就是如下:public class myActivity extends AppCompatActivity
int flag = 0;
int a,b;
protected void onCreate(Bundle savedInstanceState)
//主线程执行自己的任务;
a = 1;
b = 1;
Thread thread = new Thread(new Runnable() //开启子线程
@Override
public void run()
//子线程执行自己的任务
a = a+b;
//到这而完成置标志位为1
flag = 1;
thread.start();
while(flag ==0); //等待子线程执行完毕,主线程才能往下执行
flag = 0;
a = a+b; // 此时 a = 3(如果没有while(flag==0),这里a就为2)
如何使“主线程”等待“子线程”执行结束后再继续执行
觉得设置一个标记比较好 boolean flag=false;例如一个子线程:
class childThread extends Thread
.....
while(true)
public void run()
.......
flag=true//当子线程运行完成后标记设为true
然后根据该标记的值判断子线程是否执行。
你可以这样写:
....
childThread ct=new childThread();
ct.start();
if(ct.flag == false)
Thread.sleep(10);[color=#00FF00]当子线程没有执行完毕,就让主线程等待[/color].....
如果不设置标记判断 而是直接让主线程 Thread.sleep(xxx)睡眠是不合理的。
原因是:
由于主线程和子线程是并发运行的 睡眠的时间不好控制 如果时间太短 可能子线程没有运行完主线程就又开始运行了。如果时间太长 影响程序的执行效率 所以这个时间是不好控制的。
上面有的直接 Thread.sleep(100);完全是想当然的想法。 直接这样写有可能是会出错的 你可以试下。
所以我觉得还是设置一个标记比较好。 参考技术A 在主线程里调用子线程,这样“子线程”执行结束后,才会继续执行主线程的后续程序。
以上是关于Android可以让主线程在其他子线程执行完后再执行吗?如果可以,该怎么做?的主要内容,如果未能解决你的问题,请参考以下文章