ホームページ Java &#&面接の質問 Java インタビュー スレッド プール

Java インタビュー スレッド プール

Dec 17, 2020 am 10:12 AM
java スレッドプール インタビュー

Java インタビュー スレッド プール

以下は、Java インタビューで私がまとめたスレッド プールに関する一般的な質問の一部です。ここで共有します。

(学習ビデオ共有: Java 教育ビデオ )

スレッド プールとは何ですか?

スレッド プールはマルチスレッド処理の一種で、処理中にタスクがスレッド プールに投入され、タスクの実行がスレッド プールによって管理されます。

リクエストごとに処理するスレッドが作成されると、サーバーのリソースはすぐに使い果たされてしまいます。スレッド プールを使用すると、作成および破棄されるスレッドの数を減らすことができ、各ワーカー スレッドを再利用できます。複数のタスクを実行できます。 。

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

スレッドの作成と破棄のコストは比較的大きく、これらの時間は業務の処理時間よりも長くなる可能性があります。このような頻繁なスレッドの作成と破棄は、ビジネス ワーカー スレッドと相まってシステム リソース時間を消費し、システム リソースの不足につながる可能性があります。 (スレッドの作成と破棄のプロセスを削除できます)

スレッド プールの役割は何ですか?

スレッド プールの機能は、システム内の実行スレッドの数を制限することです。

1. 効率を向上します。一定数のスレッドを作成してプールに入れ、必要に応じてプールから 1 つ取り出します。これは、必要に応じてスレッド オブジェクトを作成するよりもはるかに高速です。

2. 管理を容易にするために、スレッド プール管理コードを記述して、プール内のスレッドを均一に管理できます。たとえば、プログラムは開始時に 100 個のスレッドを作成します。リクエストがあるたびに、スレッドが作成されます。同時リクエストが 101 件あった場合、無限のスレッド作成によるシステム クラッシュを避けるために、余分なリクエストをキューに入れることができます。

いくつかの一般的なスレッド プールと使用シナリオについて話しましょう

1. newSingleThreadExecutor

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

2. newFixedThreadPool

同時スレッドの最大数を制御できる固定長のスレッド プールを作成し、超過したスレッドはキューで待機します。

3. newCachedThreadPool

キャッシュ可能なスレッド プールを作成します。スレッド プールの長さが処理の必要性を超えた場合は、アイドル状態のスレッドを柔軟にリサイクルできます。リサイクルできない場合は、新しいスレッドを作成します。

4. newScheduledThreadPool

スケジュールされた定期的なタスクの実行をサポートするために、固定長のスレッド プールを作成します。

スレッド プール内のいくつかの重要なパラメータ

corePoolSize は、スレッド プール内のコア スレッドの数です。これらのコア スレッドは、役に立たなくなった場合にのみリサイクルされません

maximumPoolSize は、スレッド プールに収容できるスレッドの最大数です。

keepAliveTime は、コア スレッド以外の他のスレッドをスレッド プールに保持できる最長時間です。コアスレッドはタスクがなくてもクリアできません。残りのスレッドには生存時間があります。これは、非コアスレッドが保持できる最長のアイドル時間を意味します。

util を使用して、この時間を 1 単位として計算します。

workQueue は待機キューです。実行を待つタスク キューにタスクを格納できます。FIFIO 原則 (先入れ先出し) が実装されています。

(その他の関連するインタビューの質問の共有: java インタビューの質問と回答)

threadFactory は、スレッドを作成するスレッド ファクトリです。

handler は拒否戦略であり、タスクがいっぱいになった後で特定のタスクの実行を拒否できます。

スレッド プールの拒否戦略について話す

リクエスト タスクが引き続き到着し、現時点でシステムがそれらを処理できない場合、採用する必要がある戦略はサービスを拒否することです。 RejectedExecutionHandler インターフェイスは、タスク処理を拒否するカスタム メソッドの機会を提供します。 ThreadPoolExecutor には 4 つの処理戦略が含まれています。

AbortPolicy 戦略: この戦略は例外を直接スローし、システムが正常に動作しなくなります。

CallerRunsPolicy 戦略: スレッド プールが閉じられていない限り、この戦略は現在破棄されたタスクを呼び出し側スレッドで直接実行します。

DiscardOleddestPolicy 戦略: この戦略は、実行されようとしているタスクである最も古いリクエストを破棄し、現在のタスクを再度送信しようとします。

DiscardPolicy 戦略: この戦略は、何も処理せずに処理できないタスクをサイレントに破棄します。

JDK がデフォルトで提供する 4 つの拒否戦略に加えて、独自のビジネス ニーズに応じて拒否戦略をカスタマイズできます。カスタマイズ方法は非常に簡単で、RejectedExecutionHandler インターフェイスを直接実装するだけです。

実行と送信の違いは何ですか?

これまでの説明では、executeメソッドを使用してタスクを実行しましたが、executeメソッド以外にも、サブミットしたタスクを実行できるsubmitメソッドもあります。

これら 2 つの方法の違いは何ですか?どのようなシナリオに適用できますか?簡単な分析をしてみましょう。

execute は、戻り値に注意を払う必要がないシナリオに適しており、実行のためにスレッドをスレッド プールにスローするだけで済みます。

submit メソッドは、戻り値に注意する必要があるシナリオに適しています

5 つのスレッド プールの使用シナリオ

newSingleThreadExecutor: 順次実行を保証する必要があり、1 つのスレッドのみが実行されるシナリオで使用できるシングルスレッド スレッド プール。

newFixedThreadPool: 既知の同時実行圧力の下でスレッドの数を制限するために使用できる固定サイズのスレッド プール。

newCachedThreadPool: 無限に拡張できるスレッド プール。比較的実行時間の短いタスクの処理に適しています。

newScheduledThreadPool: 遅延してスケジュールして開始できるスレッド プール。定期的なタスクを実行するために複数のバックグラウンド スレッドが必要なシナリオに適しています。

newWorkStealingPool: 複数のタスク キューを持つスレッド プール。接続数を減らし、並列実行に使用可能な現在の CPU 数でスレッドを作成できます。

スレッド プールを閉じる

スレッド プールを閉じるには、shutdownNow および shutdown メソッドを呼び出します。

shutdownNow: 実行中のすべてのタスクに中断() を発行し、実行を停止し、キャンセルします。まだ開始されていないすべてのタスクを返し、まだ開始されていないタスクのリストを返します。

shutdown: shutdown を呼び出すと、スレッド プールは新しいタスクを受け入れなくなりますが、送信されたタスクや実行中のタスクを強制的に終了することはありません。

スレッド プールの初期化時のスレッド数の選択

タスクが IO 集中型の場合、通常、スレッド数を CPU 数の 2 倍以上に設定する必要があります。 CPU リソースの使用を最大化します。

タスクが CPU を集中的に使用する場合、通常、スレッド数は CPU の数に 1 を加えて設定するだけで済みます。スレッドを増やすと、コンテキストの切り替えが増加するだけで、CPU 使用率は増加しません。

上記は単なる基本的な考え方であり、本当に正確な制御が必要な場合は、オンラインになった後もスレッド プール内のスレッドとキューの数を観察する必要があります。

スレッド プールにはどのような種類のワーク キューがありますか?

1. ArrayBlockingQueue

は、配列構造に基づく制限付きブロッキング キューです。このキューは FIFO に基づいています。 (先入れ先出し) 要素を並べ替える原則。

2. LinkedBlockingQueue

リンク リスト構造に基づくブロッキング キューこのキューは、FIFO (先入れ先出し) に従って要素を並べ替え、通常、スループットは ArrayBlockingQueue よりも高くなります。静的ファクトリ メソッド Executors.newFixedThreadPool() は、要素を格納しないブロック キューであるこのキュー

#3、SynchronousQueue

を使用します。各挿入操作は、別のスレッドが削除操作を呼び出すまで待機する必要があります。そうでない場合、挿入操作は常にブロックされ、スループットは通常 LinkedBlockingQueue よりも高くなります。静的ファクトリ メソッド Executors.newCachedThreadPool はこのキューを使用します。

4. PriorityBlockingQueue

優先度のある無限ブロッキング キュー。

関連コースの推奨事項:

Java 入門チュートリアル

以上がJava インタビュー スレッド プールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

未来を創る: まったくの初心者のための Java プログラミング 未来を創る: まったくの初心者のための Java プログラミング Oct 13, 2024 pm 01:32 PM

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。

See all articles