非同期で呼び出される 2 つのメソッドがあるとします。methodA() は数千回呼び出され、どこかで methodA() が methodB() を呼び出します。methodB() の呼び出し元は、続行する前に Future/AsyncResult を使用した結果を必要とします。
@Asynchronous methodA()
@Asynchronous methodB()
問題は、それらが同じスレッド プールを使用し、すべての methodA() 呼び出しがキューに入れられると、methodB() で使用できるスレッドがなくなることです。したがって、実行中のすべての methodA() 呼び出しは methodB() を待機しており、デッドロックが発生しています。
とにかくこのあたりはありますか?@Asynchronous メソッドで使用するスレッド プールを指定する方法はありませんか? グラスフィッシュ 3.1.2.2 を使用しています。
スタック トレースには、次のような多くのスレッドがあります。
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007e1a4b010> (a java.util.concurrent.FutureTask$Sync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:218)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at com.sun.ejb.containers.EjbFutureTask.get(EjbFutureTask.java:106)