この記事では、面接中に遭遇する可能性のあるスレッド プールに関する問題について紹介します。一定の参考価値があり、困っている友人は参考にしてください。
面接中にマルチスレッドとスレッドプールに関する質問によく遭遇します。どのように答えればよいでしょうか?今日は、Java のスレッド プールについて学びます。
スレッド プールとは、マルチスレッド アプリケーションの初期化中にスレッドのコレクションを作成し、代わりに新しいタスクを実行する必要があるときにこれらのスレッドを再利用することを指します。新しいスレッドの作成について。スレッド プール内のスレッドの数は、通常、利用可能なメモリの量とアプリケーションのニーズに完全に依存します。ただし、使用可能なスレッドの数を増やすことは可能です。スレッド プール内の各スレッドにはタスクが割り当てられ、タスクが完了すると、スレッドはプールに戻り、次に割り当てられたタスクを待ちます。
端的に言うと、アプリケーションに対して複数のスレッドを実行するスレッド コレクションです。
スレッド プールを使用して、現在次の問題を解決しました。
スレッド プールを使用してビデオ内の複数のカバーを取得し、それによって保存お金がかかりました。時間とリソースがかかりました。
バックグラウンド サーバーは複数の画像のアップロードをサポートしていません。スレッド プールを使用して複数の画像をアップロードすると、アップロード時間が短縮されます
レンダリングは次のとおりです:
アップロード前: 9 枚の写真が撮影されます。少なくとも 3 秒間、スレッド プールの最適化後、9 枚の写真に 1 秒かかります。
マルチスレッド アプリケーションでスレッドを使用する必要があるのは、次の理由からです:
1. スレッドの作成数と破棄時間を削減します。各ワーカー スレッドは複数のタスクを実行するために再利用できます。
2. システムの容量に応じてスレッド プール内の作業スレッドの数を調整し、過度のメモリ消費によるサーバーの枯渇を防ぐことができます (各スレッドには約 1MB のメモリが必要です)メモリ。オープンされるスレッドが増えるほど、より多くのメモリが消費され、最終的にはクラッシュします)。
スレッド プールにより、アプリケーションの応答時間が短縮されます。スレッド プール内のスレッドは準備ができており、タスクが割り当てられるのを待っているため、アプリケーションは新しいスレッドを作成せずにそれらを直接使用できます。
スレッド プールは、有効期間の短いタスクごとに完全なスレッドを作成するオーバーヘッドを CLR に節約し、タスクの完了後にリソースを再利用できます。
スレッド プールは、システムで現在実行中のプロセスに基づいてスレッド タイム スライスを最適化します。
スレッド プールを使用すると、各スレッドのプロパティを設定せずに複数のタスクを開始できます。
スレッド プールを使用すると、実行中のタスクのプログラム パラメーターの状態情報を含むオブジェクト参照を渡すことができます。
スレッド プールを使用すると、特定のリクエストを処理するスレッドの最大数を制限するという問題を解決できます。
長年のファファファをなだめます
スレッドの役割プールはシステム内の実行を制限するためのスレッドの数です。
システム環境に応じて、スレッドの数を自動または手動で最適な運用効果を実現するように設定できます。少ないとシステム リソースの無駄が発生し、多いとシステムの輻輳や非効率が発生します。スレッド プールを使用してスレッドの数を制御し、他のスレッドは並んで待機します。タスクが実行されると、キュー内の最前部のタスクが取得され、実行が開始されます。キュー内に待機中のプロセスがない場合、スレッド プールのこのリソースは待機中になります。新しいタスクを実行する必要がある場合、スレッド プールに待機中のワーカー スレッドがあれば実行を開始できますが、そうでない場合は待機キューに入ります。
例を挙げてください
new Thread(new Runnable() { @Override public void run() { paPaPaYourGridFriend(); } }).start();
まだ新しいスレッドを使用して非同期タスクを実行している場合は、アウトです。
まだ新しいスレッドを使用して非同期タスクを実行している場合は、アウトです。
まだ新しいスレッドを使用して非同期タスクを実行している場合は、アウトです。
a. 新しいスレッドがオブジェクトを作成するたびに、パフォーマンスが低下します。
b. スレッドには統合管理が欠如しており、新しいスレッドが無制限に存在して互いに競合し、システム リソースを占有しすぎてクラッシュや OOM が発生する可能性があります。
c. スケジュールされた実行、定期的な実行、スレッドの中断などの機能が不足しています。
1. newSingleThreadExecutor
シングルスレッド スレッド プールを作成します。このスレッド プールには 1 つのスレッドだけが動作しており、これはすべてのタスクを直列に実行する単一のスレッドと同等です。唯一のスレッドが異常終了した場合、新しいスレッドがそれを置き換えます。このスレッド プールにより、すべてのタスクが送信された順序で実行されることが保証されます。
2.newFixedThreadPool
创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
3. newCachedThreadPool
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,
那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
4.newScheduledThreadPool
创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
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>ScheduledExecutorService</h5><p><img src="https://segmentfault.com/img/remote/1460000015702768" alt=" " title=" "><br></p><h5>newFixedThreadPool</h5><p><img src="https://segmentfault.com/img/remote/1460000015702769" alt=" " title=" "></p><h5><img src="https://segmentfault.com/img/remote/1460000015702770" alt=" " title=" "></h5><p style="max-width:90%"><strong>newCachedThreadPool</strong></p><p><img src="https://segmentfault.com/img/remote/1460000015702771" alt=" " title=" "><br></p><h6>相比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 サイトの他の関連記事を参照してください。