Handler,Runnable和Threads有什么区别?

Handler,Runnable和Threads有什么区别?

当我使用android时,我需要在后台运行一些东西。 我使用线程来运行它。 通常我会编写一个扩展Thread并实现run方法的类。

我也看到了一些可运行的例子,并将其传递到线程中。

不过我还是很困惑。 有人能给我一个明确的解释吗?

  1. 如果可以在Thread的run方法中写入后台代码,Runnable的意义何在?
  2. 线程中如何使用Handler,为什么我们需要使用它。
  3. Android有另外一个叫runOnUiThread的东西,我们怎么用呢? 我知道它用于更新用户界面。

Solutions Collecting From Web of "Handler,Runnable和Threads有什么区别?"

为什么使用Runnable over Thread?

  • Runnable从代码的运行中分离需要asynchronous运行的代码。 这使您的代码更加灵活。 例如,runnable中的asynchronous代码可以在线程池或专用线程上运行。

    一个Thread有状态,你的runnable可能不需要访问。 获得更多的状态比必要的是糟糕的devise。

    线程占用大量的内存。 为每个小动作创build一个新线程需要处理时间来分配和释放这个内存。

runOnUiThread实际上在做什么?

  • Android的runOnUiThread队列一个Runnable在UI线程上执行。 这很重要,因为你不应该从多个线程更新UI。 runOnUiThread使用一个Handler

    请注意,如果UI线程队列已满,或者需要执行的项目很长,可能需要一段时间才能实际运行排队的Runnable

什么是处理程序?

  • 处理程序允许您发布runnables以在特定线程上执行。 在幕后,runOnUi Thread将您的Runnable与Android的Ui Handler排队,以便您的runnable可以在UI线程上安全地执行。

1.为什么可运行?

Runnable只是一个你需要实例化一个线程来包含它的接口。 而线程已经包含了产生线程的能力。如果扩展线程,则不能扩展其他任何东西(Java不支持多inheritance)。 你可以在一个类上有多个接口,因此你可以有Runnable。

而且,当扩展Thread类时,每个线程都会创build唯一的对象并与其关联。 当您实现Runnable时,它将共享同一个对象到多个线程。

2.为什么要使用处理程序,它是什么?

处理程序是用Java编写的(内部使用一个线程),所以你可以用Handler做的所有事情,你也可以使用一个线程来实现。

那么你为什么要使用处理程序? 原因如下

  • Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象。 简而言之,处理程序使您的工作变得简单。

  • Android有两个处理线程的主要规则:

  • 不要阻塞UI线程

  • 不要从UI线程之外访问Android UI工具包

要通过上述2条规则进行绑定,在android中,我们有3个内置方法,可以在您的某个Activity类在其他线程上运行或调用时处理这种情况。

然后,我们可以使用以下三种方法安排UI更新在UI线程上运行。 活动或视图然后作为一个处理程序(下面的处理程序更多),并安排您的可运行到UI线程:

  1. Activity.runOnUiThread(可运行)
    1. View.post(可运行)
    2. View.postDelayed(Runnable,long)//(long =调度的时间)

3.什么是UI线程?

UI线程是View和Activity等UI元素被渲染的主线程。 任何耗时的操作都不应该在UI线程中发生。 应用程序默认运行在UI线程中。 你不需要做任何特殊的事情来使用UI线程。

处理程序,Runnable和线程实际上一起工作,我不认为你应该比较它们。

处理器

允许以安全方式在两个线程之间发送消息,这意味着发送线程将消息放入目标线程队列,并且此目标队列将在适当的时间处理该消息。

可运行

这是一个你实现的接口,在实现中你把你想要在某个线程上执行的逻辑。 你也可以在非线程相关的地方使用Runnable。 许多Java apis实际上使用Runnable,不仅是Thread的。 您可以使用处理程序发布Runnable,或者可以将其与执行程序一起使用。 Runnables很好,因为你可以用匿名实现的forms实现它们。

UniThread

你的意思是UI线程? 大多数用户界面在单线程中实现其工作,所有UI元素:窗口/小部件使用消息进行通信(就像在Handler中一样)。 IE浏览器。 用户按下button,这会启动一个消息,按下button的信息,它被发送到UI线程,并最终传递给您的监听器。

在Android中,它被禁止(导致exception)从非UI线程修改UI元素,这是有道理的 – 如果您要从其他线程修改它,这可能发生在UI线程正在对相同的小部件进行一些更改时 – 导致未定义的行为。

如果可以在Thread的run方法中写入后台代码,Runnable的意义何在?

Runnable是一个接口,用于创build类似于扩展java.lang.Thread类所创build的线程类的新线程类。 唯一不同的是, Runnable接口允许类扩展其他类(如果需要)来覆盖/inheritance某些类的function。 扩展java.lang.Thread类将撤消此function。

此外,Runnable接口表示一个任务,可以通过纯线程或执行程序或任何其他方式执行。 所以像Runnable这样的Task比逻辑分离是好的devise决策。

阅读更多信息: http : //javarevisited.blogspot.com/2012/01/difference-thread-vs-runnable-interface.html#ixzz2qgjDYJhT

我使用线程来运行它。 通常我会编写一个扩展Thread并实现run方法的类。

1.如果可以在Thread的run方法中写入后台代码,Runnable有什么意义?

使用Runnable并从Runnable创build线程是一般的做法。

从关于Runnable Vs 并发性的 Oracle教程Thread用法:

可运行对象,更一般化,因为Runnable对象可以inheritanceThread以外的类。

2.线程中如何使用Handler,为什么我们需要使用它。

这是一个广泛的话题来解释。 从官方文档站点简单地说:

  1. Handler允许您发送和处理与线程的MessageQueue关联的MessageRunnable对象。 每个Handler实例都与单个线程和该线程的消息队列相关联。

  2. 当你创build一个新的Handler ,它绑定到正在创build它的线程的线程/消息队列 – 从这一点开始, 它将消息和可运行消息传递到消息队列,并在消息出来时执行它们队列。

  3. Handler有两个主要的用途:(1)安排消息和可运行子程序作为将来的某个点执行; 和(2)排队一个行动在你自己的另一个线程上执行

  4. 为应用程序创build一个进程时,其主线程将专门运行一个消息队列,负责pipe理顶级应用程序对象(活动,广播接收器等)以及它们创build的任何窗口。 您可以创build自己的线程,并通过Handler与主应用程序线程进行通信。 这是通过像以前一样调用相同的post或sendMessage方法,而是从你的新线程完成的。 然后给定的Runnable或Message将在Handler的消息队列中进行调度,并在适当的时候进行处理。

这个来自anishar Ali的blog.mindorks.com文章的图片清楚地解释了概念。

在这里输入图像说明

3.Android有另外一个叫runOnUiThread的东西,我们怎么用呢? 我知道它用于更新用户界面。

你可以通过查看runOnUiThread的实现来find更多的细节

 /** * Runs the specified action on the UI thread. If the current thread is the UI * thread, then the action is executed immediately. If the current thread is * not the UI thread, the action is posted to the event queue of the UI thread. * * @param action the action to run on the UI thread */ public final void runOnUiThread(Runnable action) { if (Thread.currentThread() != mUiThread) { mHandler.post(action); } else { action.run(); } } 

请参考下面的post,例如Handler使用的代码。

Android:在一个线程中吐司