有人可以简单地向我解释以下条款,以及它们之间的关系吗?
handler
- 每个线程都有一个处理程序?每个视图有一个处理程序?
执行post()
。
OS主线程有一个默认处理程序?
looper
-
looper thread
-
post
- 将一个runnable添加到线程任务队列的末尾
task
- 可运行或消息
executor
- 管理线程池以执行某些任务。如果几次执行相同的任务,则非常有用。
timer
-
runnable vs message
- 何时使用它们?
thread's queue
- 每个线程都有一个任务队列。
我应该熟悉的任何其他术语 关于Android中的并发问题?
答案 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
同步方法。我最常用的两个是Semaphore
和CountDownLatch
(可能我使用后者最多)。有时可能会发生这样的情况:在某个其他部分(或Thread
)完成执行之前,您不希望执行某些代码部分。这种方法可以安全地生活。
有几个已经并发准备的数据结构。这些数据结构基本上已经实现了上面提到的,所以如果你同时在多个地方使用.add()
,Java本身会处理该事件并设法不显示任何异常。更多信息here。