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

标签 android multithreading

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

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

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

最佳答案

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

具体取决于线程调度和线程优先级。

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

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

如果你打算执行很多任务,你最好去 threads pool无论如何。

EDIT2

举个例子,考虑一个非常简单的 Activity,它有一个非常了解自己的大按钮:

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 事件,稍后您将有机会处理它们 ;)

关于android - 多线程如何在单核cpu上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31988595/

相关文章:

android - ListView 中的复选框,setChecked(true) 在 Nougat 中不起作用

安卓 银河 Nexus : can't see folder when connecting as Media Device (MTP)

android - android dao报错是怎么回事?

multithreading - 在 STM TVar 中使用整数是个好主意吗?

java - AES Java 多线程异常

java - 在Java中将线程更改为进程

android - 使用 BitmapRegionDecoder 加载 jpeg 会产生棋盘格失真

java - getResources().getString() 在 Java 中如何工作

iphone - NSTimer在其他线程中不起作用

c++ - Boost asio - 同时阅读和写作