2013-05-11 2 views
2

Je viens de commencer à m'exercer à utiliser des pools de threads. Je crée une application de banque serveur-client en Java, j'ai parcouru une partie de la documentation Oracle et je pense à utiliser un pool de threads en cache. Mais j'ai effectué quelques tests de comptage et il m'a semblé que le pool de threads fixes était plus rapide. Le pool de threads mis en cache a pris du retard et semble créer trop de threads inutiles. (ou peut-être que je fais quelque chose de mal ici).Java: quel genre de ThreadPool devrais-je utiliser ici?

Ma question est, dans une situation réelle, qui serait plus efficace? Ou y at-il un autre type de piscine qui serait plus efficace.

De plus, dans mon test de comptage J'ai quelques lignes:

ExecutorService executor = Executors.newCachedThreadPool(); 

    for (int i = 0; i < 500; i++) { 
      Runnable worker = new serv(10000000L + i); 
      executor.execute(worker); 
    } 

Dans les lignes ci-dessus, sont des fils inutilisés réutilisés automatiquement (au lieu de créer de nouvelles), ou est-il autre chose que je dois ajouter pour s'assurer que cela arrive?

+0

Si vos tâches sont liées à la CPU, vous pouvez utiliser un pool fixe correspondant au nombre de processeurs que vous avez. –

Répondre

1

Il y a une explication dans API Executors.newCachedThreadPool()

threads qui n'ont pas été utilisés pendant soixante secondes sont terminées et retirées de la cache. Ainsi, un pool qui reste inactif assez longtemps ne consommera aucune ressource.

2

Je suis en retard, vous avez déjà accepté une autre réponse, mais voici mon:

Je ne recommanderais pas à l'aide newCachedThreadPool() sauf si vous savez ce que vous faites. La raison en est qu'il créera autant de threads nécessaires pour exécuter les tâches qui lui sont soumises. Cela peut conduire à des circonstances indésirables, telles que l'épuisement des descripteurs ou même l'écrasement de la JVM, car trop de threads ont été créés. Bien que, il supprime les threads inactifs de la piscine après 60 secondes, mais il provoque toujours une croissance illimitée.

Retour yo votre question:

Dans les lignes ci-dessus, sont des fils inutilisés réutilisés automatiquement (au lieu de créer de nouvelles), ou est-il autre chose que je dois ajouter pour vous assurer que cela se produit?

Cela dépend. Disons que chacun de vos Runnable worker met du temps à se terminer (par exemple, 2 minutes). Par conséquent, vous allez créer 500 threads dans votre boucle. Une fois toutes les tâches terminées, ces 500 threads resteront en mémoire pendant 60 secondes et seront ensuite réclamés.

Si vous souhaitez réutiliser des threads, utilisez 'Executors.newFixedThreadPool (...) `et spécifiez le nombre de threads que vous souhaitez utiliser. Si vous soumettez plus de tâches que de threads, les tâches attendront dans la file d'attente jusqu'à ce qu'un thread devienne disponible.