2014-01-17 40 views
21

Handler,Runnable和Threads有什么区别?Handler,Runnable和Threads有什么不同?

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

我也看到一些例子,它们可以运行并传入可运行的线程中。

但是我仍然感到困惑。有人能给我一个明确的解释吗?

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

我不知道很多有关处理程序和UniThread,因此评论没有回答,但通常你只会永远做Runnable接口的实现。如果你想改变推理的话,你通常只会扩展线程 –

+0

我不能多说关于Android的细节,但是你使用'Runnable',因为它给你更多的灵活性来安排你正在运行的工作。直接使用'Thread'意味着你被困在一个特定的策略中。 – chrylis

+0

如果你能向我展示一些例子,那将会很棒。 –

回答

1

什么是可运行的点,如果可以在 线程的run方法编写后台代码?

Runnable是用于创建类似于由延伸java.lang.Thread类创建的线程类新的线程类的接口。唯一不同的是,Runnable接口允许类扩展其他类(如果需要)来覆盖/继承某些类的功能。扩展java.lang.Thread类将撤消此功能。

此外,Runnable接口表示一个任务,它可以通过纯线程或执行程序或任何其他方式执行。因此任务与Runnable的逻辑分离比Thread更好地进行设计决策。

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

20

为什么用了Runnable了主题?

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

    A Thread已声明您的runnable可能不需要访问。获得比必要更多的状态是糟糕的设计。

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

runOnUiThread实际上在做什么?

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

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

什么是处理程序?

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

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

处理程序

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

的Runnable

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

UniThread

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

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

+0

我看到Thread类实现了Runnable接口。我对可运行性的理解与并发性无关。线程是完成这项工作的人。 Runnable只是可以放在代码上的东西,所以它可以使用线程运行。我是对的? –

+0

正确的,但主题是因为Android组件(即活动)的相当复杂的生命周期的android系统相当低层次的概念,你应该使用的AsyncTask,装载机,IntentService-S,... – marcinj

+0

还线程占用了大量的内存。他们创造和收集成本很高。 –

8

1.为什么可运行?

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

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

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

处理程序是用Java编写的(内部使用一个线程),所以一切都可以用做处理程序,可以实现使用线程太多。

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

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

  • Android已经为处理线程两大规则:

  • 不要阻塞UI线程

  • 不要从UI线程

要通过绑定外部访问Android的UI工具包上述2条规则,在android中,我们有3个内置方法,可以处理您的一个Activity类在其他线程上运行或调用时的情况。

然后,我们可以安排UI更新与下面这三种方法在UI线程上运行。活动或视图然后就像处理(详见下文处理)和日程您可运行到UI线程:

  1. Activity.runOnUiThread(Runnable接口)
    1. View.post(Runnable接口)
    2. View.postDelayed(Runnable接口,长)//(=长的时间调度)

3.什么是UI线程?

UI线程是其中相同的视图和活动中的UI元素呈现主线程。任何耗时的操作都不应该在UI线程中发生。应用程序默认运行在UI线程中。你不需要做任何特殊的事情来使用UI线程。

0

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

1.如果可以在Thread的run方法中写入背景代码,那么Runnable的意义何在?

使用Runnable和从Runnable创建线程是一般做法。

从Oracle教程concurrency关于Runnable Vs的Thread用法:

Runnable对象,是较为一般,因为Runnable对象可以继承比其他线程的一类。

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

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

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

  2. 当你创建一个新的Handler,它绑定到创建它的线程的线程/消息队列 - 从,将邮件传递和可运行到消息队列,并执行它们作为点他们走出消息队列。

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

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

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

enter image description here

3.Android有另一件事叫runOnUiThread,我们如何使用呢?我知道它用于更新用户界面。

你可以寻找到实现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使用的示例代码了解详情。

Android: Toast in a thread

相关问题