Handler,Runnable和Threads有什么不同?

Handler,Runnable和Threads有什么区别?

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

我还看到了一些可以运行的implments并将runnable传递给Threads的例子。

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

  1. 如果可以在Thread的run方法中编写后台代码,那么Runnable有什么意义呢?
  2. Handler如何在内部线程中使用,为什么我们需要使用它。
  3. Android还有另一个调用runOnUiThread的东西,我们如何使用它? 我知道它用于更新UI。

Solutions Collecting From Web of "Handler,Runnable和Threads有什么不同?"

为什么在线程上使用Runnable?

  • Runnable分离需要从代码运行方式异步运行的代码。 这可以保证您的代码灵活。 例如,runnable中的异步代码可以在线程池或专用线程上运行。

    Thread有状态你的runnable可能不需要访问。 获得更多不必要的状态是糟糕的设计。

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

runOnUiThread究竟在做什么?

  • Android的runOnUiThread将一个Runnable排队,以便在UI线程上执行。 这很重要,因为您永远不应该从多个线程更新UI。 runOnUiThread使用Handler

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

什么是处理程序?

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

1.为什么要跑?

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

此外,当您扩展Thread类时,每个线程都会创建唯一对象并与之关联。 实现Runnable时,它将同一对象共享给多个线程。

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

Handler是用Java编写的(内部使用Thread),所以你可以用Handler做的一切,你也可以使用Thread实现。

那你为什么要使用Handler呢? 原因如下

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

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

  • 不要阻止UI线程

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

要按照上面提到的2条规则进行绑定,在android中我们有3个内置方法可以处理当你的一个Activity类在不同的线程上运行或调用时的情况。

然后,我们可以使用以下三种方法安排UI更新在UI线程上运行。 然后,Activity或View作为处理程序(下面的处理程序更多)并将runnable安排到UI线程:

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

3.什么是UI线程?

UI线程是呈现View和Activity等UI元素的主线程。 任何耗时的操作都不应该在UI线程中发生。 应用程序默认值在UI Thread中运行。 您无需执行任何特殊操作UI线程。

Handler,Runnable和Threads实际上是一起工作的,我不认为你应该比较它们。

处理器

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

可运行

这是一个你实现的接口,在实现中你将逻辑放在某个线程上。 实际上,您也可以在非线程相关的位置使用Runnable。 很多Java apis实际上都使用Runnable,而不仅仅是Thread。 您可以使用处理程序发布Runnable,也可以将其与执行程序一起使用。 Runnables很不错,因为您可以以匿名实现的forms实现它们。

UniThread

你的意思是UI线程? 大多数用户界面在单线程中实现其工作,所有UI元素:windows / widgets使用消息进行通信(就像在Handler中一样)。 IE浏览器。 用户按下按钮,这将启动一条消息,其中包含按下按钮的信息,它将发送到UI线程,最后传送给您的监听器。

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

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

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

此外,Runnable接口表示可以由普通线程或执行器或任何其他方式执行的任务。 所以将Task作为Runnable与Thread进行逻辑分离是一个很好的设计决策。

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

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

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

使用Runnable并从Runnable创建一个Thread是一般做法。

从关于Runnable Vs Thread使用的并发性的 oracle教程:

Runnable对象,更通用,因为Runnable对象可以inheritanceThread以外的类。

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

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

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

  2. 当您创建一个新的Handler ,它被绑定到正在创建它的线程的线程/消息队列 – 从那时起, 它将消息和runnables传递给该消息队列并在消息出来时执行它们队列。

  3. Handler有两个主要用途:(1)安排消息和runnables作为未来某些点执行; (2)将要在不同于自己的线程上执行的动作排入队列

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

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

在此处输入图像描述

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

您可以通过查看runOnUiThread的实现来查找更多详细信息

 /** * 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(); } } 

有关Handler使用的示例代码,请参阅下面的post。

Android:在线程中敬酒