我一直在软件中使用多线程。但是令我困惑的是,多线程如何提高应用程序的性能?据我所知,操作系统为进程/应用分配了一个线程。如果您在该进程内创建多个线程,那么这些线程就不像是OS分配给该进程的全新线程。而是一个线程在另一个线程等待时一次执行。我对此可能是错的,因此我想消除这种困惑。
有关非UI线程和UI线程的示例将非常有帮助。
编辑:
我接受了,只要不将Mainthread替换为可运行对象,Handler的实例将创建一个新的单独的UI线程,无论它是否与mainUI线程上的负载相关联,对不对?
// executes code on mainUI thread thread?
new Handler(Looper.getMainLooper()).post(){
....
}
// creates a separate UI thread that isn't related to/executes code on mainUI thread at all, Correct?
new Handler(new Runnable()).post(){
....
}
最佳答案
一般来说,它不会提高应用程序的性能。它可以解决有关UX的特定问题,例如减少垃圾。
不,Android应用程序一开始将由框架创建多个线程。这些包括主应用程序线程和活页夹线程池。
对,他们是。
在多核CPU上,多个线程可以真正并行执行。即使在单核CPU上,Linux调度程序(Android核心中的Linux内核的一部分)也会在线程之间进行时间片。
主应用程序线程(又称UI线程)在其核心只是一个线程。但是,该线程负责调度按键和触摸事件并以其他方式应用UI更新。重要的是不要阻塞该线程,因此,如果您正在该线程上运行(例如, Activity 和片段的onCreate()
,小部件的onClick()
,getView()
中的ListAdapter
),则需要非常快速地返回,最好在毫秒。否则,您会在Android中将其“冻结”定义为冻结的UI,尤其是在该UI应该处于动画状态时(例如,滚动ListView
)。
因此,例如,假设我们要下载一个文件,该文件足够大,将需要10秒钟来下载。无论是在主应用程序线程上还是在后台线程上下载文件,都不会影响整体性能,因为这两种方法都需要10秒钟。但是,在主应用程序线程上下载将冻结我们的UI 10秒钟,这将使用户不满意。在后台线程上下载文件可以避免此问题。请注意,默认情况下,尝试在主应用程序线程上执行网络I/O失败在Android 4.0+(带有NetworkOnMainThreadException
)上进行,特别是为了避免发生此特定问题。
关于java - UI和非UI线程的多线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29879259/