假设我们有两个异步调用的方法。methodA() 被调用了几千次,并且在某个地方 methodA() 调用了 methodB()。methodB() 的调用者在继续之前需要使用 Future/AsyncResult 的结果。
@异步方法A()
@异步方法B()
问题是它们使用相同的线程池,一旦所有的 methodA() 调用都排队,就没有更多的线程可用于 methodB()。因此,所有正在运行的 methodA() 调用都在等待 methodB() 并且我们遇到了死锁。
有没有办法解决?不应该有一种方法来指定在 @Asynchronous 方法中使用哪个线程池吗?我们正在使用 glassfish 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)