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

时间:2015-08-13 12:42:31

标签: android multithreading

在学习android中的多线程时,我感到很困惑,因为多个线程实际上是如何在cpu中执行的。我知道整体而言,cpu(单核)使用循环算法来运行各种进程,给出了parellel处理的错觉,但cpu如何在单个进程中管理多个线程。

我已经读过,在为android开发应用程序时,我们必须从主/ ui线程中完成所有资源密集型工作,这样ui在执行密集工作时不会反应迟钝。但是< br />&#34;因为单个核心cpu一次只能执行一个线程&#34; ,所以每当cpu忙于工作线程,那么它可能没有运行ui线程,所以在那个阶段,由于cpu忙于工作线程,ui得不到响应。线程有帮助吗? 我需要用一个例子对此进行概念性的解释。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

如果您计划执行大量任务,最好还是选择threads pool

<强> EDIT2

作为一个例子,考虑一个非常简单的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));
            }
        });
    }
}

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

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