当前位置:百问十五>生活百科>ActivityThread是UI线程吗,它并没有继承自Thread?

ActivityThread是UI线程吗,它并没有继承自Thread?

2024-06-01 11:31:50 编辑:join 浏览量:561

ActivityThread是UI线程吗,它并没有继承自Thread?

并非主线程, 只是运行在主线程的对象

准确得说,运行ActivityThread的线程是UI线程或者是主线程。换句话说,at运行在应用程序主线程。

大概是这样的:

如果你学过javase,你应该知道所有程序一开始都会执行main方法,所以一个app的启动最开始是启动虚拟机,然后执行ActivityThread的main方法。

这个main方法所在的进程就是主进程了。

当Zygote启动时,会分裂出system_server并进行不断地ipc轮询,system_server会创建AMS等服务。当你在桌面点击一个app图标时,并且这个app在内存中是无实例的。ams会通知system_server,由system_server通知Zygote去fork出子进程并执行ActivityThread的main方法。main方法的调用是在子进程的主线程中。

前面几位答主说的很好,但感觉还是没有说到点上,我说下我的理解吧。

首先,我们通常说的主线程是怎么来的?这个问题可以回答为主线程有一套特有的消息循环机制,也就是Looper,换句话说, 一个线程要是拥有了主线程的Looper消息循环,我们就可以称这个线程是主线程。

OK,基于上面的理解,我们可以将问题转换为,Looper是在哪里设置的主线程消息循环,没错,答案就是大家熟悉的Looper.prepareMainLooper方法,Looper对象通过调用该方法为当前线程(具体代码就是调用Thread.currentThread)创建消息循环,也正是因为该方法的调用,所以该线程才能被称为我们所说的"主线程"。

OK,我们现在只需要找到Looper.prepareMainLooper方法在哪个线程调用的即可,没错,就是我们熟悉的ActivityThread的main函数,在这个main函数里调用了该方法。

综上,所以 ActivityThread的main函数执行的线程就是主线程了 。

但是 ActivityThread只是一个管理主线程的类,它运行于主线程中,和Thread类没有任何关系

ActivityThread对象的创建位于Zygote进程启动的应用进程的默认线程中。

事实上,是先有ActivityThread,后在它的main方法(就是JavaSE里的public static void main(String …args)中创建了Application对象和Activity对象、执行相关的生命周期。

我们把跑生命周期方法的线程叫做了主线程,ActivityThread本来就是跑在这线程里。

虚拟机启动时候默认运行的那个线程,你可以简单理解为运行java.main 函数时候所在的线程。另外ActivityThread 跟线程没有任何关系,只是这个线程需要一个入口(有main函数的类),而这个入口就是这个类。如果你理解了我上面的话,希望下面说的不会让你混乱: 其实你往深处挖的话可以理解为两个入口,ActivityThread是最终的入口,另外一个入口在 ZygoteInit里面。它的具体过程就是系统进程的ZygoteInit 收到某个消息之后,通过fork的方式构建一个虚拟机进程,而这个虚拟机进程以ActivityThread为新的调用入口。

运行ActivityThread的线程恰巧是所谓的UI线程

public final class ActivityThread {

public static void main (String[] args) {

// ... run main loop

}

}

///////////////////////////////////////////////////

public class HelloWorld {

public static void main (String[] args) {

System.out.println("Hello World");

}

}

标签:ActivityThread,UI,线程

版权声明:文章由 百问十五 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.baiwen15.com/life/129152.html
热门文章