国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ Java &#&ベース Javaスレッドプールの詳しい説明

Javaスレッドプールの詳しい説明

Nov 26, 2019 pm 03:05 PM
java スレッドプール

Javaスレッドプールの詳しい説明

#スレッド プールの概要

1. スレッド プールは、スレッドを管理するプールであり、作成を削減できます。スレッドの破棄によりリソースが消費(fèi)されます。

スレッドは実際にはオブジェクトであるため、オブジェクトを作成するには、クラスの読み込みプロセスを経て、オブジェクトを破棄し、GC ガベージを経る必要があります。収集プロセスのすべてにリソースのオーバーヘッドが必要です。

2. 応答速度の向上: タスクが到著したときに、スレッド プールからスレッドを取得する場合に比べ、自分でスレッドを作成する方が確実に遅くなります。使い終わったらスレッドをプールに戻し、再利用の効果を?qū)g現(xiàn)します


(推奨ビデオ:

java ビデオ チュートリアル

)

スレッド プールの実行

メタファーを作成するコア スレッドを會社の正規(guī)従業(yè)員と比較します

非コア スレッドを外注従業(yè)員と比較します

ブロッキング キューはデマンド プールと比較されます

タスクの送信は送信と比較されます要件

正式な実行Javaスレッドプールの詳しい説明

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime,TimeUnit unit,
   BlockingQueue<Runnable> workQueue,
   ThreadFactory threadFactory,
   RejectedExecutionHandler handler)
corePoolSize     核心線程數(shù)
maximumPoolSize  線程池最大線程數(shù)
keepAliveTime    空閑線程存活時(shí)間
TimeUnit         線程空閑存活時(shí)間單位
workQueue        存放任務(wù)的阻塞隊(duì)列
threadFactory    線程工廠
handler          飽和策略

● タスクを送信し、スレッド プール內(nèi)に殘っているコア スレッドの數(shù)がスレッド數(shù) corePoolSize より少ない場合、スレッド プールは、送信されたタスクを処理するためのコア スレッドを作成します。 ## ● スレッド プール內(nèi)のコア スレッドの數(shù)がいっぱいの場合、つまりスレッドの數(shù)が corePoolSize と等しい場合、新しく送信されたタスクはタスク キュー workQueue に置かれ、実行のためにキューに入れられます。

# スレッド プール內(nèi)に殘っているスレッドの數(shù)が corePoolSize と等しく、タスク キュー workQueue もいっぱいの場合、スレッドの數(shù)が MaximumPoolSize に達(dá)しているかどうか、つまりスレッドの最大數(shù)が 0 であるかどうかを判斷します。そうでない場合は、非コアを作成します スレッドは、送信されたタスクを?qū)g行します。

# 現(xiàn)在のスレッド數(shù)がmaximumPoolSizeに達(dá)し、新しいタスクが來ると、拒否ポリシーが直接使用されます。

いくつかの飽和戦略

AbortPolicy         拋出一個(gè)異常,默認(rèn)的
DiscardPolicy       直接丟棄任務(wù)
DiscardOldestPolicy 丟棄隊(duì)列里最老的任務(wù),將當(dāng)前這個(gè)任務(wù)繼續(xù)提交給線程池
CallerRunsPolicy    交給線程池調(diào)用所在的線程進(jìn)行處理

スレッド プール例外処理

スレッド プール中にスレッド処理タスクが発生するためcall 例外はスレッド プールによってキャッチされる可能性があるため、タスクの実行が認(rèn)識されない可能性があるため、スレッド プールの例外を考慮する必要があります。

方法 1:

@Test
public void test1() throws Exception {
    ExecutorService executorService = Executors.newFixedThreadPool(5);
    for (int i = 0; i < 5; i++) {
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("name: " + Thread.currentThread().getName());
                    Object a = null;
                    System.out.println(a.hashCode());
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        });
    }
}

方法 2:

@Test
public void test2() throws Exception {
    ExecutorService executorService = Executors.newFixedThreadPool(5);
    for (int i = 0; i < 20; i++) {
        Future<?> future = executorService.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("name: " + Thread.currentThread().getName());
                Object a = null;
                System.out.println(a.hashCode());
            }
        });
        try {
            future.get();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

スレッド プール ワーク キュー

● ArrayBlockingQueue

● LinkedBlockingQueue#● SynchronousQueue

#● DelayQueue

#● PriorityBlockingQueue

==ArrayBlockingQueue==

● 特定の配列を初期化します。容量

# 再入可能なロックを使用します。デフォルトでは不公平なロックが使用されます。エンキューとデキューは同じロックを共有します。相互排他

# は制限された設(shè)計(jì)です。容量がいっぱいの場合、要素は使用できません。要素が削除されるまで追加される

# 使用する場合は、連続メモリを開放してください 初期化容量が大きすぎるとリソースの無駄が発生しやすくなります 小さすぎるとリソースの無駄が発生しやすくなります追加に失敗しました。

#==LinkedBlockingQueue==

● リンク リスト データ構(gòu)造を使用します

#● 非連続メモリ空間

## ● 2 つのリエントラント ロックを使用します要素の入口と出口をそれぞれ制御し、Condition を使用してスレッド間のウェイクアップとデキューを行います。 Wait

● 境界あり、デフォルトのコンストラクターの容量は Integer.MAX_VALUE

==SynchronousQueue= =

#● 內(nèi)部容量は 0

● すべての削除操作は挿入操作を待機(jī)する必要があります

##● すべての挿入操作は削除操作を待機(jī)する必要があります

# 要素の場合、挿入スレッドと削除スレッドが存在すると、すぐに挿入スレッドは削除スレッドに渡されます。このコンテナはチャネルに相當(dāng)し、要素は格納されません

● マルチタスク キューでは、これがタスクを処理する最も速い方法です。

#==PriorityBlockingQueue==

#● 無制限の設(shè)計(jì)ですが、実際の容量はシステム リソースに依存します。

## ● 要素を追加し、複數(shù)の場合は優(yōu)先順位を入力します

==DelayQueue==

● ボーダレスデザイン

#● 追加 (put) はブロックせず、ブロックを削除します

● 要素には有効期限があります

● 期限切れの要素のみが取り出されます

一般的に使用されるスレッド プール

● newFixedThreadPool (スレッド數(shù)が固定されたスレッド プール)

● newCachedThreadPool (スレッドをキャッシュできるスレッド プール)

#● newSingleThreadExecutor (シングル スレッド スレッド プール)

#● newScheduledThreadPool (スケジュールされた定期的な実行用のスレッド プール)

== newFixedThreadPool==

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

機(jī)能

1. コア スレッドの數(shù)は、スレッドの最大數(shù)と同じです

2.いわゆる非アイドル時(shí)間、つまり keepAliveTime は 0

3 です。ブロッキング キューは無制限のキューです LinkedBlockingQueue

動作メカニズム:

#● タスクの送信

##● スレッド數(shù)がコア スレッドより少ない場合は、タスクを?qū)g行するためのコア スレッドを作成します

● スレッド數(shù)がコア スレッドと等しい場合、タスクを LinkedBlockingQueue ブロッキング キューに追加します

● 如果線程執(zhí)行完任務(wù),去阻塞隊(duì)列取任務(wù),繼續(xù)執(zhí)行。

==newCachedThreadPool==

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

線程池特點(diǎn)

● 核心線程數(shù)為0

● 最大線程數(shù)為Integer.MAX_VALUE

● 阻塞隊(duì)列是SynchronousQueue

● 非核心線程空閑存活時(shí)間為60秒

Javaスレッドプールの詳しい説明

工作機(jī)制:

● 提交任務(wù)

● 因?yàn)闆]有核心線程,所以任務(wù)直接加到SynchronousQueue隊(duì)列。

● 判斷是否有空閑線程,如果有,就去取出任務(wù)執(zhí)行。

● 如果沒有空閑線程,就新建一個(gè)線程執(zhí)行。

● 執(zhí)行完任務(wù)的線程,還可以存活60秒,如果在這期間,接到任務(wù),可以繼續(xù)活下去;否則,被銷毀。

使用場景

用于并發(fā)執(zhí)行大量短期的小任務(wù)。

使用SynchronousQueue作為工作隊(duì)列,工作隊(duì)列本身并不限制待執(zhí)行的任務(wù)的數(shù)量。但此時(shí)需要限定線程池的最大大小為一個(gè)合理的有限值,而不是Integer.MAX_VALUE,否則可能導(dǎo)致線程池中的工作者線程的數(shù)量一直增加到系統(tǒng)資源所無法承受為止。

如果應(yīng)用程序確實(shí)需要比較大的工作隊(duì)列容量,而又想避免無界工作隊(duì)列可能導(dǎo)致的問題,不妨考慮SynchronousQueue。SynchronousQueue實(shí)現(xiàn)上并不使用緩存空間

==newSingleThreadExecutor==

線程池特點(diǎn)

● 核心線程數(shù)為1

● 最大線程數(shù)也為1

● 阻塞隊(duì)列是LinkedBlockingQueue

● keepAliveTime為0

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>(),
                                threadFactory));
}

工作機(jī)制

Javaスレッドプールの詳しい説明

● 提交任務(wù)

● 線程池是否有一條線程在,如果沒有,新建線程執(zhí)行任務(wù)

● 如果有,講任務(wù)加到阻塞隊(duì)列

● 當(dāng)前的唯一線程,從隊(duì)列取任務(wù),執(zhí)行完一個(gè),再繼續(xù)取,一個(gè)人(一條線程)夜以繼日地干活。

使用場景

適用于串行執(zhí)行任務(wù)的場景,一個(gè)任務(wù)一個(gè)任務(wù)的執(zhí)行

==newScheduledThreadPool==

線程池特點(diǎn)

public ScheduledThreadPoolExecutor(int corePoolSize) {
    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,new DelayedWorkQueue());
}

●?最大線程數(shù)為Integer.MAX_VALUE

●?阻塞隊(duì)列是DelayedWorkQueue

●?keepAliveTime為0

●?scheduleAtFixedRate() :按某種速率周期執(zhí)行

●?scheduleWithFixedDelay():在某個(gè)延遲后執(zhí)行

工作機(jī)制

●?添加一個(gè)任務(wù)

●?線程池中的線程從 DelayQueue 中取任務(wù)

●?線程從 DelayQueue 中獲取 time 大于等于當(dāng)前時(shí)間的task

●?執(zhí)行完后修改這個(gè) task 的 time 為下次被執(zhí)行的時(shí)間

●?這個(gè) task 放回DelayQueue隊(duì)列中

scheduleWithFixedDelay

●?無論任務(wù)執(zhí)行時(shí)間長短,都是當(dāng)?shù)谝粋€(gè)任務(wù)執(zhí)行完成之后,延遲指定時(shí)間再開始執(zhí)行第二個(gè)任務(wù)

scheduleAtFixedRate

●?在任務(wù)執(zhí)行時(shí)間小于間隔時(shí)間的情況下,程序以起始時(shí)間為準(zhǔn)則,每隔指定時(shí)間執(zhí)行一次,不受任務(wù)執(zhí)行時(shí)間影響

●?當(dāng)執(zhí)行任務(wù)時(shí)間大于間隔時(shí)間,此方法不會重新開啟一個(gè)新的任務(wù)進(jìn)行執(zhí)行,而是等待原有任務(wù)執(zhí)行完成,馬上開啟下一個(gè)任務(wù)進(jìn)行執(zhí)行。此時(shí),執(zhí)行間隔時(shí)間已經(jīng)被打亂

本文來自php中文網(wǎng),java教程欄目,歡迎學(xué)習(xí)!

以上がJavaスレッドプールの詳しい説明の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

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

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

JDBCを使用してJavaのトランザクションを処理する方法は? JDBCを使用してJavaのトランザクションを処理する方法は? Aug 02, 2025 pm 12:29 PM

JDBCトランザクションを正しく処理するには、最初に自動コミットモードをオフにし、次に複數(shù)の操作を?qū)g行し、結(jié)果に応じて最終的にコミットまたはロールバックする必要があります。 1。CONN.SETAUTOCOMMIT(FALSE)を呼び出して、トランザクションを開始します。 2。挿入や更新など、複數(shù)のSQL操作を?qū)g行します。 3。すべての操作が成功した場合はconn.commit()を呼び出し、データの一貫性を確保するために例外が発生した場合はconn.rollback()を呼び出します。同時(shí)に、リソースを使用してリソースを管理し、例外を適切に処理し、接続を密接に接続するために、接続の漏れを避けるために使用する必要があります。さらに、接続プールを使用してセーブポイントを設(shè)定して部分的なロールバックを達(dá)成し、パフォーマンスを改善するためにトランザクションを可能な限り短く保つことをお?jiǎng)幛幛筏蓼埂?/p>

Javaでカレンダーを操作する方法は? Javaでカレンダーを操作する方法は? Aug 02, 2025 am 02:38 AM

Java.Timeパッケージのクラスを使用して、古い日付とカレンダーのクラスを置き換えます。 2。LocalDate、LocalDateTime、LocalTimeを通じて現(xiàn)在の日付と時(shí)刻を取得します。 3。of()メソッドを使用して特定の日付と時(shí)刻を作成します。 4.プラス/マイナスメソッドを使用して、時(shí)間を不正に増加させて短縮します。 5. ZonedDateTimeとZoneIDを使用して、タイムゾーンを処理します。 6。DateTimeFormatterを介したフォーマットおよび解析の文字列。 7.インスタントを使用して、必要に応じて古い日付型と互換性があります?,F(xiàn)代のJavaでの日付処理は、java.timeapiを使用することを優(yōu)先する必要があります。

Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pre-formanceTartuptimeMemoryusage、quarkusandmicronautleadduetocopile-timeprocessingingandgraalvsupport、withquarkusoftentylightbetterine serverlessシナリオ。

ネットワークポートとファイアウォールの理解 ネットワークポートとファイアウォールの理解 Aug 01, 2025 am 06:40 AM

ネットワークポートアンドファイアワルクトグテルトエナブルコマニケーションwhiledensuringsecurity.1.networksarevirtualendpointsnumbered0–655 35、withwell-knownportslike80(http)、443(https)、22(ssh)、および25(smtp)識別pecificservices.2.portsoperateovertcp(信頼できる、c

Garbage CollectionはJavaでどのように機(jī)能しますか? Garbage CollectionはJavaでどのように機(jī)能しますか? Aug 02, 2025 pm 01:55 PM

JavaのGarbage Collection(GC)は、メモリを自動的に管理するメカニズムであり、到達(dá)不可能なオブジェクトを取り戻すことでメモリ漏れのリスクを軽減します。 1.GCルートオブジェクトからのオブジェクトのアクセシビリティ(スタック変數(shù)、アクティブスレッド、靜的フィールドなど)、および到達(dá)不可能なオブジェクトはゴミとしてマークされています。 2。マーククリアリングアルゴリズムに基づいて、すべての到達(dá)可能なオブジェクトをマークし、マークのないオブジェクトをクリアします。 3.世代の収集戦略を採用する:新世代(Eden、S0、S1)は頻繁にMinorGCを?qū)g行します。高齢者のパフォーマンスは少なくなりますが、MajorGCを?qū)g行するのに時(shí)間がかかります。 Metaspaceはクラスメタデータを保存します。 4。JVMはさまざまなGCデバイスを提供します。SerialGCは小さなアプリケーションに適しています。 ParallelGCはスループットを改善します。 CMSが減少します

Javaビルドツールの比較:Maven vs. Gradle Javaビルドツールの比較:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

gradleisthebetterchoiceformostnewprojectoitssuperorfficability、performance、andmoderntoolingsupport.1.gradle’sgroovy/kotlindslismoreconciseandexpressiveethanmaven’sverboseml.2.gradleorformsmavenbenbumebutedwitedwitedwitedspedexは

説明された延期聲明の例で進(jìn)みます 説明された延期聲明の例で進(jìn)みます Aug 02, 2025 am 06:26 AM

Deferは、クリーニングリソースなど、関數(shù)が戻る前に指定された操作を?qū)g行するために使用されます。パラメーターは、延期時(shí)にすぐに評価され、関數(shù)は最後のファーストアウト(LIFO)の順に実行されます。 1.複數(shù)の債務(wù)は、宣言の逆の順序で実行されます。 2.ファイルの閉鎖などの安全なクリーニングに一般的に使用されます。 3。指定された返品値を変更できます。 4.回復(fù)に適したパニックが発生した場合でも実行されます。 5。リソースの漏れを防ぐために、ループで延期の亂用を避けます。正しい使用により、コードのセキュリティと読みやすさが向上します。

ユーザーデータにHTML「入力」タイプを使用します ユーザーデータにHTML「入力」タイプを使用します Aug 03, 2025 am 11:07 AM

適切なHTMLinputタイプを選択すると、データの精度を向上させ、ユーザーエクスペリエンスを向上させ、使いやすさを向上させることができます。 1.テキスト、電子メール、電話、番號、日付など、データ型に従って対応する入力タイプを選択します。 2。HTML5を使用して、より直感的な相互作用方法を提供できるU(xiǎn)RL、色、範(fàn)囲、検索などの新しいタイプを追加します。 3.プレースホルダーと必要な屬性を使用して、フォームフィリングの効率と精度を改善しますが、プレースホルダーがラベルを置き換えることはできないことに注意してください。

See all articles