スレッド プールの設計パターンの恩恵を受けるタスクがあります (多数の小さなタスクを並行して実行する必要があります)。私は最初に単純なスレッド プールをゼロから実装しました。n 個の Runnables はすべてConcurrentLinkedQueue
、キューが空になるまでワーク ユニットをプルし、終了します。次に、「ねえ、Java で Executor を試してみましょう。私の素朴に設計されたシステムよりも、おそらくより適切にテストされ、信頼性が高いからです」と決めました。問題: 私の実装では、各スレッドは while を使用してキューが空になるまで存続し(!queue.isEmpty())
、非スレッドセーフ オブジェクトの独自のインスタンスを取得しましたSlowObject foo
。Runnable
のプールに入るすべての を渡そうとするExecutor
と、時間効率の悪いオブジェクトのインスタンスがスレッドセーフではないため失敗します。SlowObject
for eachRunnable
は構築にコストがかかるため望ましくありません。
SlowObject
「使用しているスレッドの数は?スレッドごとに 1 つ作成し、実行中のスレッドを Runnables に検出させて、使用する正しいオブジェクトを検索させましょう?」と言う方法はありますか? これは脆弱で失敗しやすいように思えますが、代わりにどのデザイン パターンを調べればよいかわかりません。