1

首先:我是一个多线程新手。所以请原谅我在这件事上的愚蠢:)

我想完成以下任务:

  1. 启动一个 Android 服务并在主线程(即服务线程)旁边初始化/启动几个线程。在这些线程中启动新线程,这些线程也初始化它们自己的东西。因此,您有一些“服务”线程,并且在这些线程中,一些“工作”线程执行专门的工作。
  2. 当客户端绑定到服务时,它通过 IBinder 对象获取服务的处理程序(顺便说一句:我正在使用 Messengers for IPC)。这是服务的处理程序,因此它是主线程处理程序。
  3. 现在绑定的客户端向服务发送一条消息,该消息在“服务处理程序”中接收。
  4. 然后服务处理程序查看接收到的消息的 msg.what 标识符,并决定应该将该消息转发到哪个服务线程(它只是一个调度程序)。
  5. 消息被转发到正确的目标服务线程,该线程现在尝试在自己的消息处理程序中处理消息。这是对消息进行实际深入调查的地方,并且基于消息内容,该服务线程中的一些其他任务/工作线程开始工作,或者如果它已经在工作,则更新其状态。消息的一些内容被移交给这个工作线程。
  6. 当工作在工作线程中完成时,将使用工作线程给出的答案(结果)创建一条新消息,并将其发送到工作线程的“父”服务线程。
  7. 服务线程从工作线程接收消息并将其转发到服务的主线程,该服务的主线程将其转发给请求客户端。
  8. 客户端从服务接收请求的消息。

到目前为止,一切都很好。我不明白的是这些部分:

  • 如何使用并发框架(执行器)创建一个或多个服务线程?我希望服务线程成为我在服务中通信的构建块,我可以根据用户想要做什么来打开或关闭它。我有一个蓝牙线程、一个 Wifi 线程、一个 NFC 线程作为服务线程。
  • 如何在每个服务线程中创建一堆线程(或者我应该说 Runnables?),以便我可以将工作分成几个部分,每个部分都有自己的功能或特定任务?
  • 如何在服务线程中创建消息处理程序,这是否意味着我也必须为该线程使用新的 Messenger?
  • 我是否也必须在工作线程中使用 Messenger,我认为这“太多了”。我在特定的服务线程中分解消息,所以这是将传入消息转换为必须完成的“工作”的地方,对吗?
  • 如何从工作线程向服务线程传达工作已完成,并从那里转发到主线程?
  • 我找到了很多关于多线程的书籍,但没有找到如何开始成为这个主题的完整傻瓜。我查看了 Java Conncurrency in Practice 一书并阅读了该书中的一些 Executors 内容。它解释了小部分,但不是从头到尾的完整故事。我需要一些“让我牵手”的书来向我介绍这些概念,而不会在 10 分钟内感到头疼:)
  • 我如何在服务线程之间相互通信,以便我可以进行某种协商过程,哪个线程进行哪个通信。例如,通过蓝牙或 WifiDirect 进行通信?这可能意味着一个服务线程接管另一个服务线程的通信。

并不是我不了解这些小部分,而是我缺少将这些小部分放在一起工作的概述。

Android 部分已“完成”,因此我只需要在服务中的多线程部分提供帮助...

4

0 回答 0