Shi*_*wal 5 multithreading android
在学习 android 中的多线程时,我对多线程在 cpu 中实际执行的方式感到困惑。我知道作为一个整体,cpu(单核)使用循环算法来运行各种进程,从而产生并行处理的错觉,但是 cpu 如何管理单个进程中的多个线程。
我已经读到,在为 android 开发应用程序时,我们必须从主/ui 线程中完成所有资源密集型工作,以便 ui 在执行密集工作时不会无响应,
但是
“因为单个核心 cpu 一次只能执行一个线程time" ,因此每当 cpu 忙于工作线程时,它可能不会运行 ui 线程,因此在该阶段,ui 不会因为 cpu 忙于工作线程而无响应。
因此多线程如何帮助?
我需要一个概念性的解释,可能是一个例子。
*************************编辑************************ ******
当工作线程正在运行时,当用户尝试与 ui 交互时会发生什么(我知道这几乎不可能,因为所有这些都发生在几毫秒内,但仍然会发生什么)?
事实上,单核处理器一次只能执行一个线程。处理器每秒会在线程之间切换多次(在给定进程中),因此,即使多个线程同时运行,它们也会有机会每秒运行几次,持续几毫秒。
详细信息将取决于线程调度和线程优先级。
阻塞 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 事件,稍后您将有机会处理它们;)
| 归档时间: |
|
| 查看次数: |
2496 次 |
| 最近记录: |