まず第一に、私はマルチスレッドの初心者です。だから、この問題に関する私の愚かさを許してください:)
私は次のことを達成したい:
- Android サービスを起動し、メイン スレッド (サービス スレッド) の隣にいくつかのスレッドを初期化/開始します。これらのスレッド内で、独自のものも初期化する新しいスレッドを開始します。したがって、いくつかの「サービス」スレッドがあり、これらのスレッド内に、専用の作業を行ういくつかの「ワーカー」スレッドがあります。
- クライアントがサービスにバインドすると、IBinder オブジェクトを介してサービスのハンドラーを取得します (ところで、私は IPC にメッセンジャーを使用しています)。これはサービスのハンドラーであるため、メインスレッドのハンドラーです。
- ここで、バインドされたクライアントがサービスにメッセージを送信し、それが「サービス ハンドラ」内で受信されます。
- 次に、サービス ハンドラは、受信したメッセージの msg.what 識別子を調べて、このメッセージをどのサービス スレッドに転送するかを決定します (これは単なるディスパッチャです)。
- メッセージは、独自のメッセージ ハンドラでメッセージを処理しようとする適切な宛先サービス スレッドに転送されます。これは、メッセージが実際に深く調査される場所であり、メッセージの内容に基づいて、このサービス スレッド内の他のタスク/ワーカー スレッドが機能するか、既に機能している場合はその状態で更新されます。メッセージの一部のコンテンツは、このワーカー スレッドに渡されます。
- ワーカー スレッドで作業が完了すると、ワーカー スレッドによって与えられた応答 (結果) を使用して新しいメッセージが作成され、ワーカー スレッドの「親」であるサービス スレッドに送信されます。
- サービス スレッドはワーカー スレッドからメッセージを受信し、それをサービスのメイン スレッドに転送します。サービスのメイン スレッドはそれを要求元のクライアントに転送します。
- クライアントは、要求されたメッセージをサービスから受け取ります。
ここまでは順調ですね。私が理解していないのは、これらの部分です:
- コンカレンシー フレームワーク (エグゼキューター) を使用して 1 つ以上のサービス スレッドを作成するにはどうすればよいですか? サービススレッドを、ユーザーが何をしたいかによってオンまたはオフにできるサービス内の通信の構成要素にしたいと考えています。サービス スレッドとして、Blueooth スレッド、Wifi スレッド、NFC スレッドがあります。
- 各サービス スレッド内に一連のスレッド (Runnables と言うべきでしょうか?) を作成して、それぞれが独自の機能または特定のタスクを持つ複数の部分に作業を分割するにはどうすればよいですか?
- サービス スレッド内でメッセージ ハンドラーを作成するにはどうすればよいですか?それは、そのスレッドにも新しい Messenger を使用する必要があるということではありませんか?
- ワーカースレッド内でもメッセンジャーを使用する必要がありますか?これは「多すぎる」と思います。特定のサービス スレッド内でメッセージを分解するので、それは、受信メッセージを実行する必要がある「作業」に変換する場所ですよね?
- 作業が完了したことをワーカースレッドからサービススレッドに伝え、そこからメインスレッドに転送するにはどうすればよいですか?
- 私はマルチスレッドに関する本をたくさん見つけましたが、このテーマについて完全な知識を得る方法については知りませんでした。Java Conncurrency in Practice の本を調べて、その本にあるエグゼキューターに関するものをいくつか読みました。それは小さな部分を説明しますが、a から z までの完全なストーリーではありません。10分で頭が痛くなることなくこれらの概念を紹介するために、「手を取ってみましょう」という本が必要です:)
- サービススレッド間で相互に通信するには、どのスレッドがどの通信を行うかについて何らかのネゴシエーションプロセスを実行できるようにするにはどうすればよいですか。たとえば、Bluetooth または WifiDirect で通信しますか? これは、1 つのサービス スレッドが他のサービス スレッドの通信を引き継ぐことを意味する可能性があります。
それは私が小さな断片を理解していないということではなく、これらの小さな断片を一緒に機能させるために見逃している概要です。
Android の部分は「完成」しているので、サービス内のマルチスレッドの部分についてのみサポートが必要です...