目次
Java の 4 つの事前定義されたスレッド プールとは何ですか?
4 種類のスレッド プールの違いは何ですか?
如何自定义线程池
ホームページ Java &#&チュートリアル Java に付属する 4 つのスレッド プールとは何ですか?

Java に付属する 4 つのスレッド プールとは何ですか?

Apr 24, 2023 pm 07:52 PM
java

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);

Java に付属する 4 つのスレッド プールとは何ですか?##デメリット: LinkBlockQueue のリンクリストブロッキングキューを使用しているため、タスクの蓄積速度が処理速度を上回るとタスクが蓄積しやすくなり、OOM メモリオーバーフローが発生しやすくなります。

newSingleThreadExecutor
  • ##定義: ExecutorService executorService =Executors.newSingleThreadExecutor();

上記のコードは newFixedThreadPoop(1) に似ていますが、FinalizableDelegatedExecutorService の追加層があるため、違いがあります。その機能は次のとおりです。 fixedExecutorService の本質は ThreadPoolExecutor であるため、fixedExecutorService は ThreadPoolExecutor に強制的に転送できますが、singleExecutorService は ThreadPoolExecutor とは何の関係もないため、強制転送は失敗します。したがって、newSingleThreadExecutor() が作成された後は、スレッド プールのパラメータを変更できません。 、そしてそれはまさに単一のスレッドです。

Java に付属する 4 つのスレッド プールとは何ですか?デメリット: LinkBlockQueueのリンクリストブロッキングキューを使用しているため、タスクの蓄積速度が処理速度を上回るとタスクが蓄積しやすくOOMメモリオーバーフローが発生しやすくなります

newCacheThreadPool

Java に付属する 4 つのスレッド プールとは何ですか?定義: ExecutorService executorService=Executors.newCacheThreadPool();

欠点: SynchronousQueue は BlockingQueue の実装であり、キューでもあります。スレッドの最大数は Integer.MAX_VALUE であるため、スレッドが多すぎると OOM メモリ オーバーフローが発生しやすくなります。

ScheduledThreadPool

定義: ExecutorService executorService=Executors.newScheduledThreadPool (2);

Java に付属する 4 つのスレッド プールとは何ですか?

源码:
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());
}
ログイン後にコピー

スレッド プールの重要なパラメータは何ですか?

ThreadPoolExecutor 構築メソッドは次のとおりです。

#keepAliveTime は現在のスレッド数を指します。 [コア スレッド数、スレッドの最大数] にあります。これらの非コア スレッドは、スレッド プールを終了する前に、何もせずにアイドル時間をどれだけ待機しますか。

Java に付属する 4 つのスレッド プールとは何ですか?

ウェイティングリストと最大スレッド数は関係ありません スレッド作成優先度=コアスレッド>ブロッキングキュー>スレッド拡張(現在のコアスレッド数が最大スレッド数未満の場合のみスレッド拡張可能) Java に付属する 4 つのスレッド プールとは何ですか?

  • コアのスレッド数が 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 + "]";
        }
    }
}
ログイン後にコピー

运行结果:

Java に付属する 4 つのスレッド プールとは何ですか?

其中7-10号线程被拒绝策略拒绝了,1、2号线程执行完后,3、6号线程进入核心线程池执行,此时4、5号线程在任务队列等待执行,3、6线程执行完再通知4、5线程执行

以上がJava に付属する 4 つのスレッド プールとは何ですか?の詳細内容です。詳細については、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

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

See all articles