11

私は自分が書いた多くのアプリケーションでマルチスレッドを使用してきました。もっと読んでいるうちに出くわしThreadPoolExecutorsました。この 2 つのシナリオを区別することはできませんでした。

それでも私が理解しているのは、タスクを複数の小さなタスクに分割してCPUを利用し、作業を高速化したいタスクがある場合は、マルチスレッドを使用する必要があるということです。またThreadPoolExecutor、タスクのセットがあり、各タスクを互いに独立して実行できる場合に使用します。

間違っていたら訂正してください。ありがとう

4

5 に答える 5

20

AThreadPoolExecutorは、低レベルの Thread API を処理する必要がなく、複数のスレッドでタスクを実行できる高レベルの API です。したがって、マルチスレッドと ThreadPoolExecutor を区別することはあまり意味がありません。

s にはさまざまな種類がありますがThreadPoolExecutor、ほとんどの場合、複数のスレッドを並行して実行できます。通常、エグゼキュータ サービスを使用し、Executorsファクトリを使用します。

たとえば、aExecutorService executor = Executors.newFixedThreadPool(10);は送信したタスクを 10 スレッドで実行します。

于 2012-09-22T20:29:01.620 に答える
10

ThreadPoolExecutorマルチスレッドを実行する1つの方法です。これは通常、次の場合に使用されます

  1. 調整を必要としない独立した操作があります(調整を妨げるものは何もありませんが、注意する必要があります)
  2. 一度に実行する操作の容量を制限し、(オプションで)プールが現在すべてのスレッドで機能している場合は、実行時に操作をキューに入れたい。

Java 7にForkJoinPoolは、通常Map-Reduceタイプの操作に使用されるaと呼ばれる別の組み込みクラスがあります。たとえば、各フォークポイントで配列を1/2に分割し、結果を待って、結果をマージすることにより、ForkJoinPoolを使用してマージソートを実装することを想像できます。

于 2012-09-22T21:19:22.423 に答える
7

スレッドプール(実行者)は、マルチスレッドの1つの形式であり、具体的には、単一のプロデューサー(複数のコンシューマーパターン)の実装であり、スレッドはワーカースレッドのチームが実行するために作業を繰り返しキューに入れます。通常のスレッドを使用して実装され、いくつかの利点があります。

  • スレッドの匿名性-どのスレッドが何を実行するかを明示的に制御することはありません。タスクを実行するだけで、それらはプールによって処理されます。
  • 作業キューとスレッドチームをカプセル化します。独自のスレッドセーフキューとループスレッドをわざわざ実装する必要はありません。
  • 負荷分散-作業者は前のタスクを完了するときに新しいタスクを実行するため、十分な数のタスクが利用可能であれば、作業は均一に分散されます。
  • スレッドのリサイクル-最初に単一のプールを作成し、タスクを継続的に供給します。作業を行う必要があるたびにスレッドを開始して強制終了し続ける必要はありません。

上記のことを考えると、プールは通常は互いに独立していて、通常は短命であるタスクに適していることは事実です(長いI / O操作は、他のタスクを実行できないプールからのスレッドを拘束するだけです)。

于 2012-09-22T21:17:40.747 に答える
1

ThreadPoolExecutorのソース コード ドキュメントから

/*
 * <p>Thread pools address two different problems: they usually
 * provide improved performance when executing large numbers of
 * asynchronous tasks, due to reduced per-task invocation overhead,
 * and they provide a means of bounding and managing the resources,
 * including threads, consumed when executing a collection of tasks.
 * Each {@code ThreadPoolExecutor} also maintains some basic
 * statistics, such as the number of completed tasks.
 *
 * <p>To be useful across a wide range of contexts, this class
 * provides many adjustable parameters and extensibility
 * hooks. However, programmers are urged to use the more convenient
 * {@link Executors} factory methods {@link
 * Executors#newCachedThreadPool} (unbounded thread pool, with
 * automatic thread reclamation), {@link Executors#newFixedThreadPool}
 * (fixed size thread pool) and {@link
 * Executors#newSingleThreadExecutor} (single background thread), that
 * preconfigure settings for the most common usage
 * scenarios.
 */

ThreadPoolExecutor同時実行を実現する 1 つの方法です。並行性を達成するには多くの方法があります。

Executorsフレームワークは、さまざまな API を提供します。重要な API の一部を以下に示します。

static ExecutorService  newFixedThreadPool(int nThreads)

無制限の共有キューで動作する固定数のスレッドを再利用するスレッド プールを作成します。

static ExecutorService  newCachedThreadPool()

必要に応じて新しいスレッドを作成するスレッド プールを作成しますが、以前に構築されたスレッドが利用可能になった場合はそれらを再利用します。

static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

指定された遅延後にコマンドを実行するか、定期的に実行するようにコマンドをスケジュールできるスレッド プールを作成します。

static ExecutorService  newWorkStealingPool()

使用可能なすべてのプロセッサをターゲット並列処理レベルとして使用して、ワークスティーリング スレッド プールを作成します。

以下の SE の質問をご覧ください。

Java Fork/Join プール、ExecutorService および CountDownLatch

Java Executor を適切に使用するには?

于 2016-02-29T03:37:16.473 に答える
1

ThreadPoolExecutor は、実際にタスクを送信する Threads を直接使用するよりも簡単な API を使用するマルチスレッド化の形式です。ただし、タスクは他のタスクをサブミットできるため、独立している必要はありません。タスクのサブタスクへの分割に関しては、JDK7 の新しい fork/join API を考えているかもしれません。

于 2012-09-22T20:28:21.293 に答える