Java ThreadPoolExecutor coincé lors de l'utilisation ArrayBlockingQueue

Je suis en train de travailler sur une application et à l'aide de ThreadPoolExecutor pour le traitement des différentes tâches. ThreadPoolExecutor est coincé après une certaine durée. Pour simuler ceci dans un environnement de plus simple, j'ai écrit un code simple où je suis capable de simuler la question.

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class MyThreadPoolExecutor {
private int poolSize = 10;
private int maxPoolSize = 50;
private long keepAliveTime = 10;
private ThreadPoolExecutor threadPool = null;
private final ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(
100000);
public MyThreadPoolExecutor() {
threadPool = new ThreadPoolExecutor(poolSize, maxPoolSize,
keepAliveTime, TimeUnit.SECONDS, queue);
threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable runnable,
ThreadPoolExecutor threadPoolExecutor) {
System.out
.println("Execution rejected. Please try restarting the application.");
}
});
}
public void runTask(Runnable task) {
threadPool.execute(task);
}
public void shutDown() {
threadPool.shutdownNow();
}
public ThreadPoolExecutor getThreadPool() {
return threadPool;
}
public void setThreadPool(ThreadPoolExecutor threadPool) {
this.threadPool = threadPool;
}
public static void main(String[] args) {
MyThreadPoolExecutor mtpe = new MyThreadPoolExecutor();
for (int i = 0; i < 1000; i++) {
final int j = i;
mtpe.runTask(new Runnable() {
@Override
public void run() {
System.out.println(j);
}
});
}
}
}

Essayez d'exécuter ce code plusieurs fois. Normalement impressions le nombre sur console et lorsque tous les threads en fin de compte, il existe. Mais des fois, il a terminé toutes les tâches et puis n'est pas résilié. Le thread dump est comme suit:

MyThreadPoolExecutor [Java Application] 
MyThreadPoolExecutor at localhost:2619 (Suspended)  
Daemon System Thread [Attach Listener] (Suspended)  
Daemon System Thread [Signal Dispatcher] (Suspended)    
Daemon System Thread [Finalizer] (Suspended)    
Object.wait(long) line: not available [native method]   
ReferenceQueue<T>.remove(long) line: not available    
ReferenceQueue<T>.remove() line: not available    
Finalizer$FinalizerThread.run() line: not available 
Daemon System Thread [Reference Handler] (Suspended)    
Object.wait(long) line: not available [native method]   
Reference$Lock(Object).wait() line: 485 
Reference$ReferenceHandler.run() line: not available    
Thread [pool-1-thread-1] (Suspended)    
Unsafe.park(boolean, long) line: not available [native method]  
LockSupport.park(Object) line: not available    
AbstractQueuedSynchronizer$ConditionObject.await() line: not available  
ArrayBlockingQueue<E>.take() line: not available  
ThreadPoolExecutor.getTask() line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available    
Thread [pool-1-thread-2] (Suspended)    
Unsafe.park(boolean, long) line: not available [native method]  
LockSupport.park(Object) line: not available    
AbstractQueuedSynchronizer$ConditionObject.await() line: not available  
ArrayBlockingQueue<E>.take() line: not available  
ThreadPoolExecutor.getTask() line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available    
Thread [pool-1-thread-3] (Suspended)    
Unsafe.park(boolean, long) line: not available [native method]  
LockSupport.park(Object) line: not available    
AbstractQueuedSynchronizer$ConditionObject.await() line: not available  
ArrayBlockingQueue<E>.take() line: not available  
ThreadPoolExecutor.getTask() line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available    
Thread [pool-1-thread-4] (Suspended)    
Unsafe.park(boolean, long) line: not available [native method]  
LockSupport.park(Object) line: not available    
AbstractQueuedSynchronizer$ConditionObject.await() line: not available  
ArrayBlockingQueue<E>.take() line: not available  
ThreadPoolExecutor.getTask() line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available    
Thread [pool-1-thread-6] (Suspended)    
Unsafe.park(boolean, long) line: not available [native method]  
LockSupport.park(Object) line: not available    
AbstractQueuedSynchronizer$ConditionObject.await() line: not available  
ArrayBlockingQueue<E>.take() line: not available  
ThreadPoolExecutor.getTask() line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available    
Thread [pool-1-thread-8] (Suspended)    
Unsafe.park(boolean, long) line: not available [native method]  
LockSupport.park(Object) line: not available    
AbstractQueuedSynchronizer$ConditionObject.await() line: not available  
ArrayBlockingQueue<E>.take() line: not available  
ThreadPoolExecutor.getTask() line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available    
Thread [pool-1-thread-5] (Suspended)    
Unsafe.park(boolean, long) line: not available [native method]  
LockSupport.park(Object) line: not available    
AbstractQueuedSynchronizer$ConditionObject.await() line: not available  
ArrayBlockingQueue<E>.take() line: not available  
ThreadPoolExecutor.getTask() line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available    
Thread [pool-1-thread-10] (Suspended)   
Unsafe.park(boolean, long) line: not available [native method]  
LockSupport.park(Object) line: not available    
AbstractQueuedSynchronizer$ConditionObject.await() line: not available  
ArrayBlockingQueue<E>.take() line: not available  
ThreadPoolExecutor.getTask() line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available    
Thread [pool-1-thread-9] (Suspended)    
Unsafe.park(boolean, long) line: not available [native method]  
LockSupport.park(Object) line: not available    
AbstractQueuedSynchronizer$ConditionObject.await() line: not available  
ArrayBlockingQueue<E>.take() line: not available  
ThreadPoolExecutor.getTask() line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available    
Thread [pool-1-thread-7] (Suspended)    
Unsafe.park(boolean, long) line: not available [native method]  
LockSupport.park(Object) line: not available    
AbstractQueuedSynchronizer$ConditionObject.await() line: not available  
ArrayBlockingQueue<E>.take() line: not available  
ThreadPoolExecutor.getTask() line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available    
Thread [DestroyJavaVM] (Suspended)  
C:\Program Files\Java\jre1.6.0_07\bin\javaw.exe (Jun 17, 2010 10:42:33 AM)  

Dans mon application réelle,ThreadPoolExecutor threads aller dans cet état, puis il cesse de répondre.

Ce qui concerne,
Ravi Rao

  • Une idée est que vous essayez ExecutorService, un de mes préférés.
  • Andren, Un ThreadPoolExecutor est un ExecutorService. ExecutorService est simplement une interface. Dans Java 1.5 bibliothèque, ThreadPoolExecutor est la seule une implémentation directe de la ExecutorService interface. Il y a un AbstractExecutorService et un DelegatedExecutorService qui ne sont pas indépendants les classes fonctionnelles. Aussi, il y a un SheceduledExecutorService interface qui s'étend ExecutorService et possède une mise en œuvre concrète.
InformationsquelleAutor Ravi Rao | 2010-06-17