Looper,工作线程和其他并发问题

时间:2014-02-22 14:40:04

标签: java android multithreading concurrency

有人可以简单地向我解释以下条款,以及它们之间的关系吗?

  1. handler - 每个线程都有一个处理程序?每个视图有一个处理程序? 执行post()。 OS主线程有一个默认处理程序?

  2. looper -

  3. looper thread -

  4. post - 将一个runnable添加到线程任务队列的末尾

  5. task - 可运行或消息

  6. executor - 管理线程池以执行某些任务。如果几次执行相同的任务,则非常有用。

  7. timer -

  8. runnable vs message - 何时使用它们?

  9. thread's queue - 每个线程都有一个任务队列。

  10. 我应该熟悉的任何其他术语 关于Android中的并发问题?

2 个答案:

答案 0 :(得分:1)

我会尽快解释,但要完全理解这些术语,我将不得不练习开发Android应用程序。

handler :附加到线程(任何线程)的对象,它既处理消息又在其线程中执行runnables。这有点重要,因为只有UI线程可以对视图进行操作,有时后台线程必须使用UI线程处理程序在视图中执行操作

looper 是一个对象,它遍历线程消息队列,弹出runnables和消息并将它们提供给线程处理程序。 UI线程已经运行了Looper

looper thread 是给定looper的主题,这里没什么特别的

发布任务执行者你已经回答了自己

计时器和类来管理少量时间。就像测量几秒或几毫秒,节省一些时间等等。

runnable vs message 主要区别在于:当你使用runnables时,海报线程指定了某些东西的实现,当你使用消息时,处理程序指定了某些动作的实现。当您只使用一张海报和一张手柄时,几乎可以互换使用。当你有许多不同的线程将相同的东西发布到同一个处理程序时,我会使用消息,反之亦然。

答案 1 :(得分:1)

除了@hsgubert所说的,还有其他一些值得一提的概念。进入“多线程世界”后,您应该知道有许多同步和并发处理方法。当你在并行运行时,你将运行你的应用程序,并且在不同的时间点,你可能会得到一些漂亮的ConcurrentModificacionException

根据我自己的经验,这是我经历过的最大的痛苦之一(内存泄漏允许),可能是因为没有一种模式如何解决它们。所以我认为你也应该知道这些概念:

  • 根据需要使用synchronized个方法/变量。在方法中,它将阻止在当前Thread结束执行之前输入另一个Thread。但是,会阻止其他Thread修改其他方法中的内部数据结构,所以要明确它。用作synchronized(variable_name) { ... }块,它会阻止variable_name被任何其他Thread修改为应用范围,直到您退出该块。

  • 有许多inter Thread同步方法。我最常用的两个是SemaphoreCountDownLatch(可能我使用后者最多)。有时可能会发生这样的情况:在某个其他部分(或Thread)完成执行之前,您不希望执行某些代码部分。这种方法可以安全地生活。

  • 有几个已经并发准备的数据结构。这些数据结构基本上已经实现了上面提到的,所以如果你同时在多个地方使用.add(),Java本身会处理该事件并设法不显示任何异常。更多信息here