ThreadPoolExecutor fixe le pool de threads avec la coutume de comportement
je suis nouveau sur ce sujet ... je suis à l'aide d'un ThreadPoolExecutor créé avec le maître d'oeuvre.newFixedThreadPool( 10 ) et après la piscine est pleine je commence à avoir un RejectedExecutionException .
Est-il un moyen de "forcer" l'exécuteur de la nouvelle tâche dans un "attendre" d'état au lieu de le rejeter et de le démarrer lorsque la piscine est libéré ?
Grâce
Question au sujet de cette
https://github.com/evilsocket/dsploit/issues/159
Ligne de code https://github.com/evilsocket/dsploit/blob/master/src/it/evilsocket/dsploit/net/NetworkDiscovery.java#L150
Avez-vous réussi à trouver une solution à ce problème?
OriginalL'auteur Simone Margaritelli | 2012-11-08
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez
Executors.newFixedThreadPool(10);
il les files d'attente de tâches et ils attendent jusqu'à ce qu'un thread est prêt.Cette méthode est
Comme vous pouvez le voir, la file d'attente utilisée est illimitée (qui peut être un problème en soi), mais il signifie la file d'attente ne remplira jamais et vous n'obtiendrez jamais un rejet.
BTW: Si vous avez des CPU des tâches, le nombre optimal de threads peut être
Une classe de test qui pourrait illustrer la situation
imprime
c'est la ligne de code donnant la question github.com/evilsocket/dsploit/blob/master/src/it/evilsocket/...
la seule raison pour laquelle vous devriez obtenir une
RejectedExecutionException
lors de l'utilisation d'unnewFixedThreadPool
serait si vous essayez d'envoyer des tâches à l'exécuteur testamentaire après sonshutdown
méthode a été appelée.Compte tenu de la piscine n'a jamais exécuter 31 tâches, je les soupçonne son plein. Aussi la corePoolSize est 0 ce qui suggère qu'il a été l'arrêt qui sera le déclencheur d'un rejet.
BTW, Vous n'avez pas besoin de cast pour ThreadPoolExecutor, je laisserais comme l'interface ExecutorService.
OriginalL'auteur Peter Lawrey
Il est très possible qu'un thread appelle
exit
, qui définitmStopped
à faux et les arrêts de l'exécuteur, mais:while (!mStopped)
boucle et tente d'envoyer une tâche à l'interprète, qui a été arrêté parexit
while
renvoie la valeur true parce que le changement fait àmStopped
n'est pas visible (vous n'utilisez pas toute forme de synchronisation autour de ce drapeau).Je dirais:
mStopped
volatilsOriginalL'auteur assylias
Appuyant sur les suggestions, vous pouvez utiliser un blocage de la file d'attente de construction d'une taille fixe
ThreadPoolExecutor
. Ensuite, si vous fournir votre propreRejectedExecutionHandler
qui ajoute des tâches de la file d'attente de blocage, il va se comporter comme décrit.Voici un exemple de comment vous pouvez construire une exécuteur testamentaire:
OriginalL'auteur andreer
Si je comprends bien, vous avez votre pool de threads créés avec un nombre fixe de threads, mais vous pourriez avoir plus chargé pour être soumis à la pool de threads. Je calcuate les paramètres en fonction de la demande et de définir de façon dynamique. De cette façon, vous n'auriez pas RejectedExecutionException.
Par exemple
long keepAliveTime = ((les applications.size() * 60) /FIXED_NUM_OF_THREADS) * 1000;
threadPoolExecutor.setKeepAliveTime(paramètres, TimeUnit.MILLISECONDES);
où l'application est une collection de la tâche qui pourrait être différent à chaque fois.
Qui devrait résoudre votre problème si vous connaissez la moyenne de temps de la tâche de prendre.
OriginalL'auteur Paresh Dhabalia