gpt4 book ai didi

android - 多线程如何在单核cpu上运行

转载 作者:搜寻专家 更新时间:2023-11-01 08:41:42 26 4
gpt4 key购买 nike

在学习 android 中的多线程时,我对多个线程在 cpu 中实际执行的方式感到困惑。我知道作为一个整体,cpu(单核)使用循环算法来运行各种进程,给人以并行处理的错觉,但 cpu 如何在单个进程中管理多个线程。

我读到过,在为 android 开发应用程序时,我们必须在主/ui 线程之外完成所有资源密集型工作,以便 ui 在执行密集型工作时不会无响应
但是< br/> “由于单个核心 cpu 一次只能执行一个线程”,因此每当 cpu 忙于工作线程时,它可能不会运行 ui 线程,因此在该阶段 ui 不会无响应,因为cpu 正忙于工作线程。
因此多线程有何帮助?
我需要一个概念性的解释,可能需要一个例子。

***************************编辑****************** ***************
当工作线程正在运行时用户尝试与 ui 交互时会发生什么(我知道这几乎不可能,因为所有这些都在毫秒内发生,但仍然会发生什么)?

最佳答案

单核处理器确实一次只会执行一个线程。处理器每秒会在线程之间切换多次(在给定的进程中),因此,即使多个线程同时运行,它们也会有机会每秒运行几次,持续几毫秒。

具体取决于线程调度和线程优先级。

什么阻止了 UI 线程与处理器架构完全无关。在 UI 线程上运行一个长任务可能会阻止线程执行(因为处理器将等待事件重新开始执行线程)。

编辑如果用户在 UI 线程未运行时与 UI 交互,则 UI 将无响应。但是这些 Action 在线程队列中排队。这意味着即使线程在某个时候无法处理 UI 操作,它仍然会在稍后执行这些任务。当然有一些限制。

如果你打算执行很多任务,你最好去 threads pool无论如何。

EDIT2

举个例子,考虑一个非常简单的 Activity,它有一个非常了解自己的大按钮:

public class MainActivity extends ActionBarActivity {

int counter = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button b = new Button(this);
b.setText("Click me. I'll make the thread sleep for one second. Then I'll notify you in the logcat when I'm done sleeping. Afterwards, the thread will execute the next task.");
setContentView(b);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
counter++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("COUNTER", Integer.toString(counter));
}
});
}
}

如果多次单击此按钮,您将在每秒打印的 Logcat 消息中看到。这将一直持续到 Thread 队列为空,这意味着 onClick 已为每次执行的点击调用。

因此,即使 UI 线程没有运行,队列仍然会获取 UI 事件,稍后您将有机会处理它们 ;)

关于android - 多线程如何在单核cpu上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31988595/

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