Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 多线程如何在单核cpu上运行_Android_Multithreading - Fatal编程技术网

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

Android 多线程如何在单核cpu上运行,android,multithreading,Android,Multithreading,在学习android中的多线程时,我感到困惑,因为多线程实际上是如何在cpu中执行的。我知道,作为一个整体,cpu(单核)使用循环算法来运行各种进程,从而产生并行处理的错觉,但是cpu如何在单个进程中管理多个线程呢我已经了解到,在为android开发应用程序时,我们必须在主/ui线程之外完成所有资源密集型工作,以便ui在执行密集型工作时不会无响应但是“因为单核cpu一次只能执行一个线程”,因此,每当cpu忙于工作线程时,它可能不会运行ui线程,因此在该阶段,ui不会因为cpu忙于工作线程而无响应

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

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

*************************编辑******************************

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

在单处理器系统中,多个线程一个接一个地执行,或者等待一个线程完成或被操作系统抢占,这取决于线程优先级和操作系统策略。但是,相对于用户空间应用程序所需的应用程序响应时间,正在运行的线程会产生一种错觉,即它们同时运行


参考资料:

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

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

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

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

如果你计划执行很多任务,你最好还是去做一次

EDIT2

作为一个例子,考虑一个非常简单的活动,有一个大按钮,它自己知道很多:

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

您可能会发现它很有用,并且“我知道作为一个整体,cpu(单核)使用循环算法来运行各种进程,从而产生并行处理的错觉,但cpu如何以相同的方式管理单个进程中的多个线程”。@m0skit0 U表示即使线程也以循环方式执行?“那么,当工作线程运行时(即使100毫秒),那么在这段时间内ui线程会被阻塞吗?”是的。“如果用户在这段时间内尝试与ui交互,它将不会响应,直到为该线程分配了时间,尽管如我所说,时间片足够短,所以用户不会注意到。”(您不会注意到100毫秒),并且并非所有进程/线程都具有相同的优先级。是的。但我非常怀疑UI线程是否会阻塞这么长时间。默认情况下,UI线程的优先级通常高于后台线程。是的,当然有限制,我将再次编辑我的答案;)好了!提供了一些示例代码来查看它的运行情况!简而言之,如果您有一个后台线程和一个关联的队列:是的。实际上,如果您达到队列容量的限制,事情可能会变得混乱。或者如果线程按后进先出的顺序执行任务(添加的最后一个任务将在下一个执行),你将看不到:1,2,3,4,5…打印出来,但是像1,5,4,3,2这样的东西最好是阅读有关这方面的书籍或好文章,以获得对系统的良好概述。虽然需要很多时间…::是和否。睡眠确实不是很准确,但这里我们正在潜入线程调度,我们不能再做简单的假设。这是一个huuuuge域,我无法回答它,原因有两个:1)答案太复杂,无法容纳600个字符的响应;2)我对Linux/Android进程/线程调度了解不够;)最好是阅读一下。我阅读了整个“计算机系统:程序员的视角”“书,但即使在书中,他们也没有详细说明。我想可以检查一下……因为上下文切换的开销肯定会降低性能……FYI线程早在1967年就出现在OS/360多道程序设计中,有可变任务数(MVT),在这一年中,它们被称为“任务”。()维基:“抢占式多线程的缺点是,系统可能在不适当的时间进行上下文切换,导致锁护送、优先级反转或其他负面影响,这可以通过协作式多线程来避免。另一方面,协作多线程依赖于线程本身在到达停止点时放弃控制。如果线程正在等待资源可用,这可能会产生问题。”这将取决于UI的线程实现……如果它正在使用队列,则为“是”……检查此站点以清除队列