在学习android中的多线程时,我感到困惑,因为如何在cpu中实际执行多个线程。我知道,总体而言,CPU(单核)使用循环算法来运行各种进程,从而产生了并行处理的错觉,但是CPU如何在单个进程中管理多个线程。我已经读到,在为Android开发应用程序时,我们必须在main/ui线程之外进行所有资源密集型工作,以便ui不会在进行密集型工作时变得无响应,但是“由于单个核心cpu只能在一个线程上执行一个线程time”,因此每当cpu忙于工作线程时,它就可能不会运行ui线程,因此在此阶段,由于cpu忙于工作线程,因此ui不会使UI变得无响应。因此,多线程有何帮助?
我可能需要一个例子来对此进行概念上的解释。
*************************编辑************************ ******

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

最佳答案

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

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

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

编辑
如果用户在UI线程未运行时与UI进行交互,则UI将无响应。但是 Action 在线程队列中排队。这意味着即使线程在某个时候无法处理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消息中看到一条消息。这将一直持续到“线程”队列为空,这意味着每次执行单击都会调用onClick

因此,即使UI线程未运行,队列仍将获得UI事件,您将有机会稍后对其进行处理;)

10-05 22:39
查看更多