ThreadPoolExecutor génial, mais comment ça fonctionne?
Dans le cadre d 'un TP on doit créer un serveur FTP basique, jusque là rien de bien compliqué. Mais là où je galère un peu c 'est le thread pool... En effet on doit éviter que le serveur ne s' "effondre" sous un aflu de requête => donc là thread pool.
Un pti bout de code vaut mieux qu'un long discours
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
ThreadPoolExecutor pool =
new ThreadPoolExecutor(corePoolSize,
maximumPoolSize,
keepAliveTime,
timeUnit,
new SynchronousQueue<Runnable>());
while (true) {
try {
//sock est un ServerSocket déclaré précédement
sockClientServeur = sock.accept();
pool.execute(new FtpRequest(sockClientServeur,wdir));
} catch (IOException e) {
e.printStackTrace();
}
} |
Donc à chaque connexion sur le ServeurSocket, on balance le traitement dans un Runnable de type FtpRequest qui va tout gérer. Mais comment ça fonctionne dans le pool?
Je veux dire, le but du pool est -notamment- de garder une réserve de thread dans certaines limites pour éviter de les lancer (ce qui est couteux) . Donc après X connexion, c 'est ok j 'ai atteint le corePoolSize. Imaginons un des FtpRequest qui se termine -> il reste alors idle et n'est pas supprimé pour rester dans les bornes corePoolSize/maximumPoolSize. Une nouvelle connexion est établie et... il se passe quoi?
A) il lance un nouveau thread quand même : pas logique vu la doc
B) il remplace les paramètres du thread idle par les nouveaux? (aka il arrive à lui refiler la socket?!)
C) abracadabra?
je vous avoue que j'ai cherché longtemps mais rien trouvé :(