ハンドラに投稿されたRunnableオブジェクトを融合させるためのデザインコンセプトのアドバイスや批評を探しています。場合は、イベントスレッドで行う必要がある作業の小さなチャンクを生成するバックグラウンドスレッドがある場合です。各チャンクは通常の方法でハンドラにRunnableとして送信されます。これらのRunnableの1つが実行を開始していない場合、別のRunnableを構築してポストするのではなく、実行したときに追加の作業を行うように変更するのは簡単です。このような作業チャンクの合体は、別のRunnableを構築するよりも安価であり、バックグラウンドスレッドがイベントキューに溢れてしまう問題を減らすことにもなります。デザインの問題:ハンドラに送信されたオブジェクトを融合する
しかし、いくつかの問題があります。まず、イベントキューに配信された最後のRunnableにアクセスする必要があります。私が知る限り、HandlerもLooperもそのような機能を提供していないので、最後に投稿されたRunnableへの参照をバックグラウンドスレッドコードで保持するつもりです。私はちょうどこのような参照を維持することはシステムのどこにでも問題を引き起こさないと仮定しています。
さらに深刻な問題は、Runnableがキューから削除されて開始されたかどうかを知るための方法が必要だということです。私は、Runnableクラスにフラグを追加し、run()メソッドの開始時に設定することで、これを処理する予定です。フラグのテストとRunnable(バックグラウンドスレッド)の更新とRunnableの実行が開始される(イベントスレッド)フラグの設定との間に競合状態を避けるためには、まだ同期が必要です。
誰もがこのようなことをしたことがありますか?あれば、どうしましたか?私は対処する必要のあるものを見落としていますか?
私はこれが好きです。コーディネイトの複雑さが心配でした。 (私はあなたのオープニングセンテンスに完全に同意します)。ワークプールと作業スターターを導入することで、これは非常にうまく解決されます。ありがとう!作業チャンクをプールに入れる際には、並行性の問題はまだありませんが、標準のプロデューサ/コンシューマパターンがそのために行います。これを解決済みとする前に、他の誰かが別の改善を提案しているかどうかを少しでも確認したいと思います。 –