PHP の面接で遭遇する可能性のあるスレッド プールに関する質問
この記事では、面接中に遭遇する可能性のあるスレッド プールに関する問題について紹介します。一定の参考価値があり、困っている友人は参考にしてください。
はじめに
面接中にマルチスレッドとスレッドプールに関する質問によく遭遇します。どのように答えればよいでしょうか?今日は、Java のスレッド プールについて学びます。
スレッド プールとは
スレッド プールとは、マルチスレッド アプリケーションの初期化中にスレッドのコレクションを作成し、代わりに新しいタスクを実行する必要があるときにこれらのスレッドを再利用することを指します。新しいスレッドの作成について。スレッド プール内のスレッドの数は、通常、利用可能なメモリの量とアプリケーションのニーズに完全に依存します。ただし、使用可能なスレッドの数を増やすことは可能です。スレッド プール内の各スレッドにはタスクが割り当てられ、タスクが完了すると、スレッドはプールに戻り、次に割り当てられたタスクを待ちます。
端的に言うと、アプリケーションに対して複数のスレッドを実行するスレッド コレクションです。
なぜスレッド プールが必要なのでしょうか?
スレッド プールを使用して、現在次の問題を解決しました。
スレッド プールを使用してビデオ内の複数のカバーを取得し、それによって保存お金がかかりました。時間とリソースがかかりました。
バックグラウンド サーバーは複数の画像のアップロードをサポートしていません。スレッド プールを使用して複数の画像をアップロードすると、アップロード時間が短縮されます
レンダリングは次のとおりです:
アップロード前: 9 枚の写真が撮影されます。少なくとも 3 秒間、スレッド プールの最適化後、9 枚の写真に 1 秒かかります。
マルチスレッド アプリケーションでスレッドを使用する必要があるのは、次の理由からです:
1. スレッドの作成数と破棄時間を削減します。各ワーカー スレッドは複数のタスクを実行するために再利用できます。
2. システムの容量に応じてスレッド プール内の作業スレッドの数を調整し、過度のメモリ消費によるサーバーの枯渇を防ぐことができます (各スレッドには約 1MB のメモリが必要です)メモリ。オープンされるスレッドが増えるほど、より多くのメモリが消費され、最終的にはクラッシュします)。
スレッド プールにより、アプリケーションの応答時間が短縮されます。スレッド プール内のスレッドは準備ができており、タスクが割り当てられるのを待っているため、アプリケーションは新しいスレッドを作成せずにそれらを直接使用できます。
スレッド プールは、有効期間の短いタスクごとに完全なスレッドを作成するオーバーヘッドを CLR に節約し、タスクの完了後にリソースを再利用できます。
スレッド プールは、システムで現在実行中のプロセスに基づいてスレッド タイム スライスを最適化します。
スレッド プールを使用すると、各スレッドのプロパティを設定せずに複数のタスクを開始できます。
スレッド プールを使用すると、実行中のタスクのプログラム パラメーターの状態情報を含むオブジェクト参照を渡すことができます。
スレッド プールを使用すると、特定のリクエストを処理するスレッドの最大数を制限するという問題を解決できます。
長年のファファファをなだめます
スレッド プールの役割:
スレッドの役割プールはシステム内の実行を制限するためのスレッドの数です。
システム環境に応じて、スレッドの数を自動または手動で最適な運用効果を実現するように設定できます。少ないとシステム リソースの無駄が発生し、多いとシステムの輻輳や非効率が発生します。スレッド プールを使用してスレッドの数を制御し、他のスレッドは並んで待機します。タスクが実行されると、キュー内の最前部のタスクが取得され、実行が開始されます。キュー内に待機中のプロセスがない場合、スレッド プールのこのリソースは待機中になります。新しいタスクを実行する必要がある場合、スレッド プールに待機中のワーカー スレッドがあれば実行を開始できますが、そうでない場合は待機キューに入ります。
シングルスレッドの欠点
例を挙げてください
new Thread(new Runnable() { @Override public void run() { paPaPaYourGridFriend(); } }).start();
重要なことは 3 回言ってください。 ! !
まだ新しいスレッドを使用して非同期タスクを実行している場合は、アウトです。
まだ新しいスレッドを使用して非同期タスクを実行している場合は、アウトです。
まだ新しいスレッドを使用して非同期タスクを実行している場合は、アウトです。
欠点は次のとおりです:
a. 新しいスレッドがオブジェクトを作成するたびに、パフォーマンスが低下します。
b. スレッドには統合管理が欠如しており、新しいスレッドが無制限に存在して互いに競合し、システム リソースを占有しすぎてクラッシュや OOM が発生する可能性があります。
c. スケジュールされた実行、定期的な実行、スレッドの中断などの機能が不足しています。
Java スレッド プール
1. newSingleThreadExecutor
シングルスレッド スレッド プールを作成します。このスレッド プールには 1 つのスレッドだけが動作しており、これはすべてのタスクを直列に実行する単一のスレッドと同等です。唯一のスレッドが異常終了した場合、新しいスレッドがそれを置き換えます。このスレッド プールにより、すべてのタスクが送信された順序で実行されることが保証されます。
2.newFixedThreadPool
创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
3. newCachedThreadPool
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,
那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
4.newScheduledThreadPool
创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
newSingleThreadExecutor
private void TextnewSingleThreadExecutor(){ ExecutorService pool = Executors. newSingleThreadExecutor(); MyTask1 task1 = new MyTask1(); MyTask2 task2 = new MyTask2(); MyTask3 task3 = new MyTask3(); // pool.execute(task1); // pool.execute(task2); // pool.execute(task3); new Thread(task1).start(); new Thread(task2).start(); new Thread(task3).start(); } private class MyTask1 implements Runnable{ @Override public void run() { //循环输出 for(int i = 0; i <h5 id="ScheduledExecutorService">ScheduledExecutorService</h5><p><img src="/static/imghw/default1.png" data-src="https://segmentfault.com/img/remote/1460000015702768" class="lazy" alt=" " title=" "><br></p><h5 id="newFixedThreadPool">newFixedThreadPool</h5><p><img src="/static/imghw/default1.png" data-src="https://segmentfault.com/img/remote/1460000015702769" class="lazy" alt=" " title=" "></p><h5><img src="/static/imghw/default1.png" data-src="https://segmentfault.com/img/remote/1460000015702770" class="lazy" alt=" " title=" "></h5><p style="max-width:90%"><strong>newCachedThreadPool</strong></p><p><img src="/static/imghw/default1.png" data-src="https://segmentfault.com/img/remote/1460000015702771" class="lazy" alt=" " title=" "><br></p><h6 id="相比new-Thread-Java提供的四种线程池的好处在于">相比new Thread,Java提供的四种线程池的好处在于:</h6>
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。
线程池真的是太好用了,如果在项目中通过线程池管理线程,,你将会发现其中的诸多优势!
阅读更多
20+个很棒的Android开源项目
2018年Android面试题含答案--适合中高级(下)一份完整的Android Studio搭建Flutter教程[](http://mp.weixin.qq.com/s?__b...
深入了解JAVA的线程中断方法经验之总结
子线程为什么不能更新UI线程详解
相信自己,没有做不到的,只有想不到的
相关推荐:
以上がPHP の面接で遭遇する可能性のあるスレッド プールに関する質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

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

Java をシンプルに: プログラミング能力の初心者向けガイド はじめに Java は、モバイル アプリケーションからエンタープライズ レベルのシステムに至るまで、あらゆるもので使用される強力なプログラミング言語です。初心者にとって、Java の構文はシンプルで理解しやすいため、プログラミングの学習に最適です。基本構文 Java は、クラスベースのオブジェクト指向プログラミング パラダイムを使用します。クラスは、関連するデータと動作をまとめて編成するテンプレートです。簡単な Java クラスの例を次に示します。 publicclassperson{privateStringname;privateintage;

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

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