在学习android中的多线程时,我感到很困惑,因为多个线程实际上是如何在cpu中执行的。我知道整体而言,cpu(单核)使用循环算法来运行各种进程,给出了parellel处理的错觉,但cpu如何在单个进程中管理多个线程。
我已经读过,在为android开发应用程序时,我们必须从主/ ui线程中完成所有资源密集型工作,这样ui在执行密集工作时不会反应迟钝。但是< br />&#34;因为单个核心cpu一次只能执行一个线程&#34; ,所以每当cpu忙于工作线程,那么它可能没有运行ui线程,所以在那个阶段,由于cpu忙于工作线程,ui得不到响应。线程有帮助吗?
我需要用一个例子对此进行概念性的解释。
*************************编辑**************** **************
当用户在工作线程运行时尝试与ui交互时会发生什么(我知道很少有可能因为所有这些都在毫秒内发生但仍会发生什么)?
答案 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事件,您将有机会稍后处理它们;)