Comment décider d'utiliser newCachedThreadPool ou newFixedThreadPool?
Je suis en train de travailler sur un projet dans lequel je dois m'assurer que chaque thread est de travailler sur une gamme donnée. Par exemple:
NO_OF_THREADS: 2
NO_OF_TASKS: 10
Si number of threads is 2
et number of tasks is 10
puis chaque thread sera sur la scène du 10 tasks
. Cela signifie donc que 2 fil sera de faire 20 tasks
.
En réel scénario de ces chiffres (nombre de tâches et le nombre de threads) sera très élevé que les deux d'entre eux sont configurables dans mon code.
Dans l'exemple ci-dessus, first thread
devrait être à l'aide de l'id d'entre 1 and 10
et second thread
devrait être à l'aide de l'id d'entre 11 and 20
et ainsi de suite, si d'autres threads. Et après que chaque thread va faire une connexion de base de données et ensuite l'insérer dans la base de données.
Donc, j'ai mon code ci-dessous qui fonctionne bien.
public static void main(String[] args) {
final int noOfThreads = 2;
final int noOfTasks = 10;
//create thread pool with given size
ExecutorService service = Executors.newFixedThreadPool(noOfThreads);
//queue some tasks
for (int i = 0, int nextId = 1; i < noOfThreads; i++, nextId += noOfTasks) {
service.submit(new ThreadTask(nextId, noOfTasks));
}
}
class ThreadTask implements Runnable {
private final int id;
private int noOfTasks;
public ThreadTask(int nextId, int noOfTasks) {
this.id = nextId;
this.noOfTasks = noOfTasks;
}
public void run() {
//make a database connection
for (int i = id; i < id + noOfTasks; i++) {
//insert into database
}
}
}
Ma question:-
J'ai été en passant par plusieurs article sur internet et j'ai lu sur newCachedThreadPool
. Alors maintenant, je me demande est - ce que je peux utiliser newFixedThreadPool
ou newCachedThreadPool
dans mon code? Comme actuellement, je suis en utilisant nexFixedThreadPool
. Je ne suis pas en mesure de décider sur quels facteurs dois-je choisir newCachedThreadPool
ou newFixedThreadPool
. C'est la raison que j'ai posté mon scénario de ce que je vais faire avec mon code.
Quelqu'un peut m'aider que dois-je choisir? Et s'il vous plaît m'expliquer en détails pourquoi nous sommes le choix que sur les facteurs de sorte que je peux comprendre très bien. J'ai déjà passé par java docs, mais pas en mesure de décider de ce que je devrais choisir ici.
Merci pour l'aide.
source d'informationauteur | 2013-02-25
Vous devez vous connecter pour publier un commentaire.
Des extraits de la documentation Javadoc, le
newFixedThreadPool()
:Cela signifie que si vous demandez à 2 fils, il va commencer à 2 fils et de ne jamais commencer à 3. D'autre part, la
newCachedThreadPool()
:Dans votre cas, si vous ne disposez que de 2 thread à exécuter, les deux marchent très bien, puisque vous ne la soumission de 2 emplois à l'eau de votre piscine. Toutefois, si vous voulez soumettre toutes les 20 emplois à la fois, mais de seulement 2 emplois d'exécution à la fois, vous devez utiliser un
newFixedThreadPool(2)
. Si vous avez utilisé le cache de la piscine puis toutes les 20 emplois à démarrer un thread qui s'exécute dans le même temps, ce qui peut ne pas être optimale en fonction du nombre de Processeurs que vous avez.Généralement j'utilise le
newCachedThreadPool()
quand je besoin le fil est engendré immédiatement, même si tous les threads actuellement en cours d'exécution sont occupés. Récemment, j'ai utilisé quand j'étais frai minuterie tâches. Le nombre de connexions simultanées emplois sont négligeables, car je n'ai jamais frayer très nombreux, mais je les veux pour exécuter lorsqu'elles sont demandées et je tiens à re-utiliser dormant threads.J'ai utilisé
newFixedThreadPool()
quand je veux limiter le nombre de tâches simultanées cours d'exécution à tout moment, afin de maximiser la performance et non marais de mon serveur. Par exemple, si je suis le traitement de 100k lignes d'un fichier, une ligne à la fois, je ne veux pas que chaque ligne pour démarrer un nouveau thread, mais je veux un certain niveau de simultanéité j'ai donc allouer (par exemple) 10 fixe les threads pour exécuter les tâches jusqu'à ce que la piscine est épuisé.