マルチスレッド実行メソッドでサービス ビジネス クラスを直接呼び出す場合は注意が必要です。
Java マルチスレッド実行メソッドでサービス ビジネス クラスを使用すると、java.lang.NullPointerException 例外が発生します。これは、spring によって挿入されたビジネス クラスが null であるか、直接の新しいビジネス オブジェクトも null であることが原因です。
マルチスレッドではスレッドセーフのためインジェクションが防止されるため、サービスビジネスクラスを利用する場合は、ApplicationContextメソッドを使用してBeanメソッドを取得し、サービスクラスを取得する必要があります。
ApplicationContext クラスを取得するには、次のように ApplicationContextAware インターフェイスを実装する必要があります:
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class ApplicationContextUtil implements ApplicationContextAware { private static ApplicationContext context; public void setApplicationContext(ApplicationContext context) throws BeansException { this.context = context; } public static ApplicationContext getContext() { return context; } }
次に、上記のメソッドを run メソッドで使用して、次のようにビジネス オブジェクトを作成します。
XXXServiceI xxxService = ApplicationContextUtil.getContext.getBean(XXXServiceI.class);これで普通に使えます ビジネスクラスは終了です。 図は次のとおりです
#マルチスレッドの知識ポイント
スレッドを開始する 4 つの方法
1. Thread クラスを継承して Thread の run メソッドを書き換え、run メソッド内で操作を実行し、start メソッドを使用してスレッドを開始します
2. Runnable インターフェイスを継承し、run メソッドを実装し、run メソッドで操作を実行します。現在のクラスのインスタンス オブジェクトを渡して Thread インスタンスを作成し、次に呼び出す必要があります。スレッドを開始するための start メソッド
3. Callable インターフェイスを実装し、call() メソッドを書き換えます。最初の 2 つのメソッドは応答を必要としないことに注意してください。ただし、Callable インターフェースを実装して call() メソッドを書き換えると、スレッドの応答を待つ必要があるため、他のスレッドが起動しているにもかかわらず 1 つのスレッドが実行され、標準とはみなされません。マルチスレッド。
4. スレッド プール
#@Aysnc アノテーションを使用してマルチスレッドを実装する
同じクラス、メソッド A はメソッド B を参照します。メソッド B に非同期 @Async アノテーションを追加しても効果はありません
追加された @Async メソッドと呼び出し元を同じクラスに置くことはできません
ユーザー スレッドとデーモン スレッドの違い
Java で作成されたスレッドは、デフォルトで新しい Thread (スレッド オブジェクト) などのユーザー スレッドを作成します。start
Thread thread = new Thread(); // 默认为false,都是用户线程 thread.setDaemon(true); // 表示设置为守护线程 thread.setDaemon(false); // 表示设置为用户线程
- User thread
: No 他のスレッドが死ぬと死ぬ スレッドが死ぬ状況は 2 つだけあり、1 つは動作中に例外が発生して終了する場合、もう 1 つはプログラムが正常に実行されてスレッドが死ぬ場合です
- デーモン スレッド
: ユーザー スレッドが終了すると終了します。ユーザー スレッドが終了すると、gc ガベージ コレクション スレッドなどのデーモン スレッドも終了します。ユーザー スレッドが存在する場合、gc は生きている必要があり、そうでない場合は役に立ちません。
スレッドの 6 つの状態
1. 新規: 初期状態、スレッドは作成され、start() は呼び出されません
2. 実行可能:実行ステータス。Java スレッドは、オペレーティング システムの準備完了と実行中の 2 つの状態を「実行中」と呼びます。
3. ブロック済み: ブロックされ、スレッドは待機状態になり、スレッドは CPU の使用を放棄します。何らかの理由
- ブロッキングのいくつかの状況:
- A. ブロッキングを待機中: 実行中のスレッドが wait() を実行し、JVM が Put
- #B. 同期ブロック: 実行中のスレッドがオブジェクトの同期ロックを取得するとき、同期ロックが他のスレッドによって占有されている場合、JVM は現在のC. その他のブロッキング: 実行中のスレッドが sleep()、join() を実行するか、IO リクエストを発行すると、JVM は現在のスレッドをブロッキングに設定します。 sleep() 実行後、join() スレッドは終了し、IO 処理後に再びスレッドが再開されます
- 4. 待機中: 待機状態
- 5。 timed_waiting: タイムアウト待機状態、タイムアウト後に自動的に Return6.terminated: 終了ステータス、現在のスレッドは実行を完了しました
public class Demo1 { public synchronized void functionA(){ System.out.println("iAmFunctionA"); functionB(); } public synchronized void functionB(){ System.out.println("iAmFunctionB"); }Java にはアトミック性を強制する同期された内部ロック メカニズムが提供されていないと仮定します: functionA() と functionB() は両方とも同期メソッドです。 funcitonA() に入ると、このクラスのオブジェクト ロックを取得します。このロック「new Demo1()」は functionA() 内のメソッド functionB() を呼び出しますが、functionB() も同期されるため、スレッドはオブジェクト ロック (new Demo1()) を再度実行しますが、JVM はこのオブジェクトのロックを取得したと考えられ、再度取得できないため、functionB() メソッドを呼び出すことができず、デッドロックが発生します。
スレッド プールの 4 つの拒否戦略
スレッド プールのタスク キャッシュ キューがいっぱいで、スレッド プール内のスレッド数が MaximumPoolSize に達したとき、まだ到着しているタスクがある場合、タスク拒否戦略は次のようになります。通常、次の 4 つの戦略があります:
ThreadPoolExecutor.AbortPolicy
: タスクを破棄し、RejectedExecutionException をスローします。
ThreadPoolExecutor.DiscardPolicy
: タスクを破棄しますが、例外はスローしません。
ThreadPoolExecutor.DiscardOldestPolicy
: キューの最前面のタスクを破棄し、拒否されたタスクを再送信します。
ThreadPoolExecutor.CallerRunsPolicy
: 呼び出し側スレッドによって(タスクを送信したスレッド) タスクを処理します
sleep と wait の違い
sleep はスレッド内のメソッドですが、wait は Object 内のメソッドです
sleep メソッドはロックを解放しませんが、wait はロックを解放し、待機キューに追加されます
-
sleep は必要ありません覚醒する必要がありますが、wait は実行します
wait()、notify()、notifyAll() が Thread クラスではなくオブジェクト内にある理由
ロック レベルJava では、スレッド レベルではなくオブジェクト レベルであり、各オブジェクトにはスレッドを通じて取得されるロックがあります。 wait() メソッドがスレッド内にある場合、スレッドがどのロックを待機しているかは明らかではありません。
以上がJavaマルチスレッド実行メソッドでサービス・ビジネス・クラスを直接呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JVMは、バイトコード解釈、プラットフォームに依存しないAPI、動的クラスの負荷を介してJavaのWORA機能を実装します。 2。標準API抽象オペレーティングシステムの違い。 3.クラスは、実行時に動的にロードされ、一貫性を確保します。

Javaの最新バージョンは、JVMの最適化、標準的なライブラリの改善、サードパーティライブラリサポートを通じて、プラットフォーム固有の問題を効果的に解決します。 1)Java11のZGCなどのJVM最適化により、ガベージコレクションのパフォーマンスが向上します。 2)Java9のモジュールシステムなどの標準的なライブラリの改善は、プラットフォーム関連の問題を削減します。 3)サードパーティライブラリは、OpenCVなどのプラットフォーム最適化バージョンを提供します。

JVMのバイトコード検証プロセスには、4つの重要な手順が含まれます。1)クラスファイル形式が仕様に準拠しているかどうかを確認し、2)バイトコード命令の有効性と正確性を確認し、3)データフロー分析を実行してタイプの安全性を確保し、検証の完全性とパフォーマンスのバランスをとる。これらの手順を通じて、JVMは、安全で正しいバイトコードのみが実行されることを保証し、それによりプログラムの完全性とセキュリティを保護します。

java'splatformendencealLowsApplicationStorunOperatingSystemwithajvm.1)singlecodebase:writeandcompileonceforallplatforms.2)easyUpdates:updatebytecodeforsimultaneousdeployment.3)テストの実験効果:scalbortffortfforduniverbehaviol.4)

Javaのプラットフォームの独立性は、JVM、JITコンピレーション、標準化、ジェネリック、ラムダ式、Projectpanamaなどのテクノロジーを通じて継続的に強化されています。 1990年代以来、Javaは基本的なJVMから高性能モダンJVMに進化し、さまざまなプラットフォームでのコードの一貫性と効率を確保しています。

Javaはプラットフォーム固有の問題をどのように軽減しますか? Javaは、JVMおよび標準ライブラリを通じてプラットフォームに依存します。 1)bytecodeとjvmを使用して、オペレーティングシステムの違いを抽象化します。 2)標準のライブラリは、パスクラス処理ファイルパス、CHARSETクラス処理文字エンコードなど、クロスプラットフォームAPIを提供します。 3)最適化とデバッグのために、実際のプロジェクトで構成ファイルとマルチプラットフォームテストを使用します。

java'splatformentencentenhancesmicroservicesecturectureby byofferingdeploymentflexability、一貫性、スケーラビリティ、およびポート可能性。1)展開の展開の展開は、AllosmicRoserviThajvm.2)deploymentflexibility lowsmicroserviceSjvm.2)一貫性のあるAcrossServicessimplisimpligiessdevelisementand

Graalvmは、Javaのプラットフォームの独立性を3つの方法で強化します。1。言語間の相互運用性、Javaが他の言語とシームレスに相互運用できるようにします。 2。独立したランタイム環境、graalvmnativeimageを介してJavaプログラムをローカル実行可能ファイルにコンパイルします。 3.パフォーマンスの最適化、Graalコンパイラは、Javaプログラムのパフォーマンスと一貫性を改善するための効率的なマシンコードを生成します。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

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

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

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

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ホットトピック









