1. Android Application Thread 基础

本文深入解析Android中的关键线程概念,包括主线程(UIThread)、BinderThread及后台线程(BackgroundThread)。阐述了这些线程如何工作以及如何通过设置优先级和控制组来优化线程调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android Application Thread

UI Thread

UI Thread是应用中的主线程,被用于执行Android Component和更新屏幕上的UI。
UI Thread是一个顺序的事件处理线程,它能执行来自平台其他线程发送来的事件。

Binder Thread

Binder Thread被用于不同进程中的线程通信。

Background Thread

应用中显式创建的所有线程都是Background Thread。Background Thread使用UI Thread的后代,因此它们继承了UI Thread的特性。

注:
Stack(栈):存储基本类型和对象的引用;
Heap(堆):存储对象实例。

查看应用进程的信息:
UID:User ID
PID:Process identifier
PPID:Parent process identifier
这里写图片描述


Android主要有两种方式影响Thread的调度
* Priority(优先级)
改变Linux Thread Priority
* Control Group(控制组)
改变Android特有的control group


设置线程的Priority(优先级)

java.lang.Thread

setPriority(int priority); // 这个方法是平台无关的

基于Java的优先级来设置一个新的优先级值。0(最低优先级) ~ 10(最高优先级)

android.os.Process

Process.setThreadPriority(int priority); // Calling Thread
Process.setThreadPriority(int threadId, int priority); // Thread with specific id

使用Linux的优先级规则来设置一个新的值。-20(最高) ~ 19(最低)

两种之间的对应关系

这里写图片描述

Control Group(控制组)

Android中定义了多个控制组,其中应用最重要的是Foreground Group和Background Group。
在Foreground Group中的线程会比Background Group中线程分配到更多的执行时间。
这里写图片描述

使用命令查看:
Foreground Group
这里写图片描述
Background Group
这里写图片描述

把线程设置为Background Group
被Application创建的Thread默认和UI Thread有相同的Priority和Control Group,因此它们会和UI Thread强占资源。
我们可以设置为Background Thread的优先级,来防止这种情况的出现。
使用下面的方法来设置

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
java.lang.NullPointerException at com.android.tools.idea.sdk.wizard.legacy.LicenseAgreementStep.createChangesList(LicenseAgreementStep.java:258) at com.android.tools.idea.sdk.wizard.legacy.LicenseAgreementStep.initUI(LicenseAgreementStep.java:203) at com.android.tools.idea.sdk.wizard.legacy.LicenseAgreementStep.<init>(LicenseAgreementStep.java:113) at com.android.tools.idea.sdk.wizard.VmWizard$VmPath.init(VmWizard.java:246) at com.android.tools.idea.wizard.dynamic.DynamicWizardPath.attachToWizard(DynamicWizardPath.java:98) at com.android.tools.idea.wizard.dynamic.DynamicWizard.addPath(DynamicWizard.java:233) at com.android.tools.idea.sdk.wizard.VmWizard.<init>(VmWizard.java:68) at com.android.tools.idea.avdmanager.AccelerationErrorSolution.lambda$getAction$4(AccelerationErrorSolution.java:221) at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:218) at com.intellij.openapi.application.TransactionGuardImpl.access$200(TransactionGuardImpl.java:21) at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:200) at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:787) at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:325) at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:84) at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:133) at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:46) at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:189) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746) at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:969) at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:839) at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:449) at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:808) at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448) at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:787) at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:496) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
最新发布
06-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值