1

並行して実行する非同期タスクがいくつかあります。すべてのタスクは 2 つのタイプに分けることができます。タイプ A (時間がかかるもの) と、それ以外はすべてタイプ B (より速く実行するもの) を呼び出しましょう。x プールサイズの単一の ScheduledThreadPoolExecutor を使用すると、結果タイプ B がブロックされて遅延するため、最終的にある時点ですべてのスレッドがタイプ A の実行でビジーになります。私が達成しようとしているのは、タイプ A のタスクをタイプ B と並行して実行することです。パフォーマンスのために、両方のタイプのタスクをグループ内で並行して実行したいと考えています。

タイプ A とタイプ B の ScheduledThreadPoolExecutor の 2 つのインスタンスを独自のスレッド プールのみで持つのが賢明だと思いますか? このアプローチに問題はありますか?

4

1 に答える 1

1

いいえ、それは合理的なようです。私は似たようなことをしています。つまり、ID に応じてタスクを順次実行する必要があります。異なる ID を持つコンポーネント。したがって、基本的には、コンポーネントごとに個別のタスクのキューが必要です。タスクは、特定の各キューから次々とプルされます。それを達成するために私は使用します

Executors.newSingleThreadExecutor(new JobThreadFactory(componentId));

コンポーネントごとに。さらに、コンポーネント ID にバインドされていない別のタイプのタスクには ExecutorService が必要です。そのために、追加の ExecutorService インスタンスを作成します。

Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE, new JobThreadFactory());

これは、少なくとも私の場合はうまくいきます。タスクの順序付けされた実行が必要な場合に私が考えることができる唯一の問題、つまり task2 は task1 の後に実行する必要があるなど...しかし、ここではこれが当てはまるとは思えません...

于 2012-01-12T10:16:15.753 に答える