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

Shi*_*wal 5 multithreading android

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

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

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

Gor*_*dak 3

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

详细信息将取决于线程调度和线程优先级。

阻塞 UI 线程的因素与处理器架构完全无关。在 UI 线程上运行长任务可能会阻止线程执行(因为处理器将等待事件来重新启动线程的执行)。

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

如果您计划执行大量任务,那么无论如何您最好选择线程池

编辑2

举个例子,考虑一个非常简单的 Activity,有一个大 Button,它对自身了解很多:

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));
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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