gpt4 book ai didi

java - UI 和非 UI 线程的多线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:01 25 4
gpt4 key购买 nike

我一直在我的软件中使用多线程。然而让我感到困惑的是,多线程如何提高应用程序的性能?据我所知,操作系统为一个进程/应用程序分配了一个线程。如果您在该进程内创建多个线程,这些线程不像操作系统分配给该进程的全新线程。相反,一个线程在另一个线程等待时一次执行。我对此可能是错误的,因此我想消除这种困惑。

有关非 UI 线程和 UI 线程的示例将非常有帮助。

编辑:

我认为,只要我不通过 Mainthread 代替 runnable,Handler 的实例就会创建一个新的单独的 UI 线程,无论与 mainUI 线程相关/将负载放在 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(){
....
}

最佳答案

how does multithreading increases performance of an app?

一般来说,它不会提高应用的性能。它可以解决用户体验方面的特定问题,例如减少卡顿。

In my knowledge, a process/app is assigned a single thread by the OS.

不,Android 应用程序一开始会有多个线程,由框架创建。这些包括主应用程序线程和绑定(bind)器线程池。

If you create multiple threads inside that process, those threads aren't like a whole new batch of threads assigned to the process by OS.

是的,他们是。

Instead one thread executes at a time while the other thread is waiting.

在多核CPU上,多个线程可以真正并行执行。即使在单核 CPU 上,Linux 调度程序(Android 核心 Linux 内核的一部分)也会在线程之间进行时间片。

Example regarding non UI threads & UI threads will be very helpful.

主应用程序线程(又名 UI 线程)的核心只是一个线程。但是,它是负责调度按键和触摸事件以及应用 UI 更新的线程。重要的是不要阻塞该线程,因此如果您在该线程上运行(例如,onCreate() Activity 和 fragment ,onClick() 小部件, ListAdapter 中的 getView()),您需要非常快返回,最好在一毫秒内返回。否则,您将遇到“卡顿”,在 Android 中定义为卡住的 UI,尤其是当 UI 应该具有动画效果时(例如,滚动 ListView)。

因此,例如,假设我们要下载一个文件,该文件足够大,需要 10 秒才能下载完毕。无论我们是在主应用程序线程还是在后台线程下载文件都不会影响整体性能,因为这两种方式都需要 10 秒。但是,在主应用程序线程上下载会使我们的 UI 卡住 10 秒,这会让用户不满意。在后台线程上下载文件可以避免这个问题。请注意,在 Android 4.0+ 上尝试在主应用程序线程上执行网络 I/O 默认会失败(出现 NetworkOnMainThreadException),特别是为了避免这个特殊问题。

关于java - UI 和非 UI 线程的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29879259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com