ホームページ >Java >&#&チュートリアル >Javaマルチスレッド実行メソッドでサービス・ビジネス・クラスを直接呼び出す方法
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);これで普通に使えます ビジネスクラスは終了です。 図は次のとおりです
#マルチスレッドの知識ポイント
2. Runnable インターフェイスを継承し、run メソッドを実装し、run メソッドで操作を実行します。現在のクラスのインスタンス オブジェクトを渡して Thread インスタンスを作成し、次に呼び出す必要があります。スレッドを開始するための start メソッド
3. Callable インターフェイスを実装し、call() メソッドを書き換えます。最初の 2 つのメソッドは応答を必要としないことに注意してください。ただし、Callable インターフェースを実装して call() メソッドを書き換えると、スレッドの応答を待つ必要があるため、他のスレッドが起動しているにもかかわらず 1 つのスレッドが実行され、標準とはみなされません。マルチスレッド。
4. スレッド プール
#@Aysnc アノテーションを使用してマルチスレッドを実装する
追加された @Async メソッドと呼び出し元を同じクラスに置くことはできません
ユーザー スレッドとデーモン スレッドの違い
Thread thread = new Thread(); // 默认为false,都是用户线程 thread.setDaemon(true); // 表示设置为守护线程 thread.setDaemon(false); // 表示设置为用户线程
: No 他のスレッドが死ぬと死ぬ スレッドが死ぬ状況は 2 つだけあり、1 つは動作中に例外が発生して終了する場合、もう 1 つはプログラムが正常に実行されてスレッドが死ぬ場合です
: ユーザー スレッドが終了すると終了します。ユーザー スレッドが終了すると、gc ガベージ コレクション スレッドなどのデーモン スレッドも終了します。ユーザー スレッドが存在する場合、gc は生きている必要があり、そうでない場合は役に立ちません。
2. 実行可能:実行ステータス。Java スレッドは、オペレーティング システムの準備完了と実行中の 2 つの状態を「実行中」と呼びます。
3. ブロック済み: ブロックされ、スレッドは待機状態になり、スレッドは CPU の使用を放棄します。何らかの理由
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() メソッドを呼び出すことができず、デッドロックが発生します。
スレッド プールのタスク キャッシュ キューがいっぱいで、スレッド プール内のスレッド数が MaximumPoolSize に達したとき、まだ到着しているタスクがある場合、タスク拒否戦略は次のようになります。通常、次の 4 つの戦略があります:
ThreadPoolExecutor.AbortPolicy
: タスクを破棄し、RejectedExecutionException をスローします。
ThreadPoolExecutor.DiscardPolicy
: タスクを破棄しますが、例外はスローしません。
ThreadPoolExecutor.DiscardOldestPolicy
: キューの最前面のタスクを破棄し、拒否されたタスクを再送信します。
ThreadPoolExecutor.CallerRunsPolicy
: 呼び出し側スレッドによって(タスクを送信したスレッド) タスクを処理します
sleep はスレッド内のメソッドですが、wait は Object 内のメソッドです
sleep メソッドはロックを解放しませんが、wait はロックを解放し、待機キューに追加されます
sleep は必要ありません覚醒する必要がありますが、wait は実行します
ロック レベルJava では、スレッド レベルではなくオブジェクト レベルであり、各オブジェクトにはスレッドを通じて取得されるロックがあります。 wait() メソッドがスレッド内にある場合、スレッドがどのロックを待機しているかは明らかではありません。
以上がJavaマルチスレッド実行メソッドでサービス・ビジネス・クラスを直接呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。