Java に付属する 4 つのスレッド プールとは何ですか?
Java の 4 つの事前定義されたスレッド プールとは何ですか?
newSingleThreadExecutor: 単一のスレッド数を持つスレッド プール (コア スレッドの数 = 最大スレッド数 = 1)
newFixedThreadPool: 修正済みスレッド数プール (コア スレッド数 = 最大スレッド数 = カスタム)
-
newCacheThreadPool: キャッシュ可能なスレッド プール (コア スレッド数 = 0、最大スレッド数 = Integer.MAX_VALUE) )
newScheduledThreadPool: スケジュールされたタスクまたは定期的なタスクをサポートするスレッド プール (コア スレッドの数 = カスタム、最大スレッド数 = Integer.MAX_VALUE)
4 種類のスレッド プールの違いは何ですか?
上記の 4 つのスレッド プール クラスは、いずれも ThreadPoolExecutor を継承し、作成時に新しい ThreadPoolExecutor (パラメータ) を直接返します。これらの違いは、定義された ThreadPoolExecutor (パラメータ) 内のパラメータが異なることと、ThreadPoolExecutor が ExecutorService インターフェイスを継承することです。クラス。
- #newFixedThreadPool
定義:xecutorService executorService=Executors.newFixedThreadPool(2);
##デメリット: LinkBlockQueue のリンクリストブロッキングキューを使用しているため、タスクの蓄積速度が処理速度を上回るとタスクが蓄積しやすくなり、OOM メモリオーバーフローが発生しやすくなります。
- ##定義: ExecutorService executorService =Executors.newSingleThreadExecutor();
上記のコードは newFixedThreadPoop(1) に似ていますが、FinalizableDelegatedExecutorService の追加層があるため、違いがあります。その機能は次のとおりです。 fixedExecutorService の本質は ThreadPoolExecutor であるため、fixedExecutorService は ThreadPoolExecutor に強制的に転送できますが、singleExecutorService は ThreadPoolExecutor とは何の関係もないため、強制転送は失敗します。したがって、newSingleThreadExecutor() が作成された後は、スレッド プールのパラメータを変更できません。 、そしてそれはまさに単一のスレッドです。
デメリット: LinkBlockQueueのリンクリストブロッキングキューを使用しているため、タスクの蓄積速度が処理速度を上回るとタスクが蓄積しやすくOOMメモリオーバーフローが発生しやすくなります
newCacheThreadPool
定義: ExecutorService executorService=Executors.newCacheThreadPool();
欠点: SynchronousQueue は BlockingQueue の実装であり、キューでもあります。スレッドの最大数は Integer.MAX_VALUE であるため、スレッドが多すぎると OOM メモリ オーバーフローが発生しやすくなります。
ScheduledThreadPool定義: ExecutorService executorService=Executors.newScheduledThreadPool (2);
源码: public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { //ScheduledThreadPoolExecutor继承ThreadPoolExecutor return new ScheduledThreadPoolExecutor(corePoolSize); } public ScheduledThreadPoolExecutor(int corePoolSize) { //ScheduledThreadPoolExecutor继承ThreadPoolExecutor,故super()会调用ThreadPoolExecutor的构造函数初始化并返回一个ThreadPoolExecutor,而ThreadPoolExecutor使实现ExecutorService接口的 //最终ScheduledThreadPoolExecutor也和上面几种线程池一样返回的是ExecutorService接口的实现类ThreadPoolExecutor super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue()); }
#keepAliveTime は現在のスレッド数を指します。 [コア スレッド数、スレッドの最大数] にあります。これらの非コア スレッドは、スレッド プールを終了する前に、何もせずにアイドル時間をどれだけ待機しますか。
ウェイティングリストと最大スレッド数は関係ありません スレッド作成優先度=コアスレッド>ブロッキングキュー>スレッド拡張(現在のコアスレッド数が最大スレッド数未満の場合のみスレッド拡張可能)
- コアのスレッド数が 5、待ちキュー長が 3、最大スレッド数が 10 の場合、スレッド数が増加し続けると、コア スレッドは 5 になります。コア スレッドの数がいっぱいの場合、スレッドは待機キューに投入されます。待機キューがいっぱい (3 スレッド) の場合、この時点でスレッドの最大数が比較されます (後でのみ表示可能)スレッドの最大数が満たされるのを待ちます)、引き続き 2 つのスレッド (5 3 2) を作成できます。スレッド数が最大スレッド数を超えると、実行は拒否されます。戦略;
- コアスレッド数が 5、待機キュー長が 3、スレッドの最大数が 7 の場合、スレッド数が増加し続ける場合は、最初に 5 つのコアスレッドを作成し、コア スレッドの数がいっぱいです。その後、スレッドを待機キューに投入します。待機キューに 2 つのスレッドがある場合、スレッドの最大数 (5 2 = 7) に達しますが、待機キューはまだいっぱいではないため、待機キューがいっぱいになるまでスレッドの最大数を気にする必要はありません (ブロックされたスレッドが 3 つ)。この時点でスレッドの最大数が比較されます (キューを待機しているスレッドの最大数のみが比較されます)。失われた場合は終了できます)、この時点でコアはキューが失われるのを待っています = 5 3 = 8>7 = スレッドの最大数、つまり、スレッドの最大数に達しています。 スレッドの最大数に達すると、拒否されます。ポリシーが実装されます;
- 待機キューが LinkedBlockingQueue 無制限キューに設定されている場合、このキューは無限であり、最大判定値に到達することはありません。
如何自定义线程池
可以使用有界队列,自定义线程创建工厂ThreadFactory和拒绝策略handler来自定义线程池
public class ThreadTest { public static void main(String[] args) throws InterruptedException, IOException { int corePoolSize = 2; int maximumPoolSize = 4; long keepAliveTime = 10; TimeUnit unit = TimeUnit.SECONDS; BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2); ThreadFactory threadFactory = new NameTreadFactory(); RejectedExecutionHandler handler = new MyIgnorePolicy(); ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); executor.prestartAllCoreThreads(); // 预启动所有核心线程 for (int i = 1; i <= 10; i++) { MyTask task = new MyTask(String.valueOf(i)); executor.execute(task); } System.in.read(); //阻塞主线程 } static class NameTreadFactory implements ThreadFactory { private final AtomicInteger mThreadNum = new AtomicInteger(1); @Override public Thread newThread(Runnable r) { Thread t = new Thread(r, "my-thread-" + mThreadNum.getAndIncrement()); System.out.println(t.getName() + " has been created"); return t; } } public static class MyIgnorePolicy implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { doLog(r, e); } private void doLog(Runnable r, ThreadPoolExecutor e) { // 可做日志记录等 System.err.println( r.toString() + " rejected"); // System.out.println("completedTaskCount: " + e.getCompletedTaskCount()); } } static class MyTask implements Runnable { private String name; public MyTask(String name) { this.name = name; } @Override public void run() { try { System.out.println(this.toString() + " is running!"); Thread.sleep(3000); //让任务执行慢点 } catch (InterruptedException e) { e.printStackTrace(); } } public String getName() { return name; } @Override public String toString() { return "MyTask [name=" + name + "]"; } } }
运行结果:
其中7-10号线程被拒绝策略拒绝了,1、2号线程执行完后,3、6号线程进入核心线程池执行,此时4、5号线程在任务队列等待执行,3、6线程执行完再通知4、5线程执行
以上がJava に付属する 4 つのスレッド プールとは何ですか?の詳細内容です。詳細については、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)

ホットトピック









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

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

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

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

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

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。
