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