ホームページ  >  記事  >  Java  >  Java Concurrency Package: Java によって Executor を通じて提供される 4 つのスレッド プール

Java Concurrency Package: Java によって Executor を通じて提供される 4 つのスレッド プール

php是最好的语言
php是最好的语言オリジナル
2018-08-01 11:53:301713ブラウズ

Java の 4 つのスレッド プール newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor

新しい Thread の欠点

a 新しい Thread がオブジェクトを作成するたびに、パフォーマンスが低下します。
b. スレッドを統合管理しないと、新しいスレッドが無制限に作成され、互いに競合し、システム リソースを過剰に占有して、クラッシュや OOM が発生する可能性があります。
c. スケジュールされた実行、定期的な実行、スレッドの中断などの機能が不足しています。
新しいスレッドと比較して、Java によって提供される 4 つのスレッド プールの利点は次のとおりです:
a. 既存のスレッドを再利用し、オブジェクトの作成と破棄のコストを削減し、優れたパフォーマンスを実現します。
b. 同時スレッドの最大数を効果的に制御し、システム リソースの使用率を向上させ、過度のリソースの競合と輻輳を回避できます。
c. スケジュール実行、定期実行、シングルスレッド、同時実行制御などの機能を提供します。

Java は、Executor を通じて 4 つのスレッド プールを提供します。
newCachedThreadPool は、キャッシュ可能なスレッド プールを作成します。スレッド プールの長さが処理の必要性を超えた場合、アイドル状態のスレッドを柔軟にリサイクルできます。リサイクルがない場合は、新しいスレッドが作成されます。作成した。
newFixedThreadPool は、キュー内で待機する同時スレッドの最大数を制御できる固定長のスレッド プールを作成します。
newScheduledThreadPool は、スケジュールされた定期的なタスクの実行をサポートするために固定長のスレッド プールを作成します。
newSingleThreadExecutor は、タスクの実行に一意のワーカー スレッドのみを使用するシングルスレッド スレッド プールを作成し、すべてのタスクが指定された順序 (FIFO、LIFO、優先順位) で実行されるようにします。

(1). newCachedThreadPool
スレッド プールの長さが処理の必要性を超えた場合、アイドル状態のスレッドを柔軟にリサイクルできます。リサイクルする方法がない場合は、新しいスレッドを作成します。サンプルコードは以下の通りです:

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {final int index = i;try {Thread.sleep(index * 1000);} catch (InterruptedException e) {e.printStackTrace();} cachedThreadPool.execute(new Runnable() { @Overridepublic void run() {System.out.println(in
dex);}});}

スレッドプールは無限で、2番目のタスクが実行されると最初のタスクが完了し、毎回新しいスレッドを作成することなく、最初のタスクを実行していたスレッドが再利用されます。

(2). newFixedThreadPool
同時スレッドの最大数を制御できる固定長のスレッド プールを作成し、過剰なスレッドはキュー内で待機します。サンプルコードは以下の通りです:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
 
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}

スレッドプールサイズが3なので、各タスクはインデックス出力後2秒スリープするため、2秒ごとに3つの数字が出力されます。

固定長スレッド プールのサイズは、システム リソースに応じて最適に設定されます。 Runtime.getRuntime().availableProcessors() など。 「PreloadDataCache」を参照してください。

(3) newScheduledThreadPool
スケジュールされた定期的なタスクの実行をサポートするために、固定長のスレッド プールを作成します。遅延実行のサンプル コードは次のとおりです。 ScheduledExecutorService selectedThreadPool =

Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
 
@Override
public void run() {
System.out.println("delay 3 seconds");
}
}, 3, TimeUnit.SECONDS);

は、3 秒間の遅延実行を意味します。

定期実行のサンプルコードは以下の通りです:

scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
 
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);

は1秒遅れて3秒ごとに実行することを意味します。

ScheduledExecutorService は Timer よりも安全で強力です。後で比較するための別の記事があります。

(4)、newSingleThreadExecutor
シングルスレッドのスレッド プールを作成します。これは、タスクの実行に唯一の作業スレッドのみを使用し、すべてのタスクが指定された順序 (FIFO、LIFO、優先順位) で実行されるようにします。サンプルコードは以下のとおりです。

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
 
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}

結果は順番に出力されます。これは、各タスクを順番に実行するのと同じです。

現在の GUI プログラムのほとんどはシングルスレッドです。 Android の単一スレッドは、データベース操作、ファイル操作、アプリケーションのバッチ インストール、アプリケーションのバッチ削除、および同時実行には適さないその他の操作に使用できますが、IO ブロックが発生し、UI スレッドの応答に影響を与える可能性があります。

スレッド プールの役割:

スレッド プールの役割は、システム内の実行スレッドの数を制限することです。
システム環境に応じて、スレッドの数を自動または手動で設定して、最適な運用効果を実現できます。スレッドの数が少ないとシステム リソースの無駄が発生し、多いとシステムの輻輳や非効率が発生します。スレッド プールを使用してスレッドの数を制御し、他のスレッドは並んで待機します。タスクが実行されると、キュー内の最前部のタスクが取得され、実行が開始されます。キュー内に待機中のプロセスがない場合、スレッド プールのこのリソースは待機中になります。新しいタスクを実行する必要がある場合、スレッド プールに待機中のワーカー スレッドがあれば実行を開始できます。そうでない場合は、待機キューに入ります。

スレッド プールを使用する理由:

1. スレッドの作成と破棄の数を減らし、各ワーカー スレッドを再利用して複数のタスクを実行できます。

2. 過剰なメモリ消費によるサーバーの枯渇を防ぐために、システムの容量に応じてスレッド プール内の作業スレッドの数を調整できます (各スレッドには約 1 MB のメモリが必要であり、より多くのスレッドが開かれると、より多くのメモリが消費され、最終的にはクラッシュします)。

Javaにおけるスレッドプールの最上位インターフェースはExecutorですが、厳密に言えばExecutorはスレッドプールではなく、スレッドを実行するための単なるツールです。実際のスレッド プール インターフェイスは ExecutorService です。

関連記事:

Javaのスレッドプールのグラフィックコードの詳細説明

Java並行プログラミングでのスレッドプールの使用方法の詳細説明

関連動画:

Javaマルチスレッドと同時実行ライブラリ高度なアプリケーションのビデオチュートリアル

以上がJava Concurrency Package: Java によって Executor を通じて提供される 4 つのスレッド プールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。