Comment décider d’utiliser newCachedThreadPool ou newFixedThreadPool?

Je travaille sur un projet dans lequel je dois m’assurer que chaque thread travaille sur une plage particulière. Par exemple:

NO_OF_THREADS: 2 NO_OF_TASKS: 10 

Si le number of threads is 2 et le number of tasks is 10 chaque thread effectuera 10 tasks . Cela signifie donc que 2 threads feront 20 tasks .

Dans le scénario actuel, ces nombres (nombre de tâches et nombre de threads) seront très élevés car ils sont tous deux configurables dans mon code.

Dans l’exemple ci-dessus, le first thread doit utiliser id entre 1 and 10 et le second thread doit utiliser id entre 11 and 20 et ainsi de suite s’il y a d’autres threads. Et après cela, chaque thread établira une connexion à la firebase database, puis l’insérera dans la firebase database.

J’ai donc mon code ci-dessous qui fonctionne bien.

 public static void main(Ssortingng[] 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:-

Je parcourais divers articles sur Internet et j’ai lu des newCachedThreadPool sur newCachedThreadPool . Alors maintenant, je me demande est-ce que je devrais utiliser newFixedThreadPool ou newCachedThreadPool dans mon code? Comme actuellement, j’utilise nexFixedThreadPool . Je ne suis pas capable de décider quels facteurs choisir newCachedThreadPool ou newFixedThreadPool . C’est la raison pour laquelle j’ai posté mon scénario ce que je vais faire avec mon code.

Quelqu’un peut-il m’aider que dois-je choisir ici? Et s’il vous plaît, expliquez-moi en détail pourquoi nous choisissons cela en fonction de quels facteurs afin que je puisse très bien comprendre. Je suis déjà passé par java docs mais je ne suis pas capable de décider de ce que je devrais choisir ici.

Merci pour l’aide.

Alors maintenant, je me demande est-ce que je devrais utiliser newFixedThreadPool ou newCachedThreadPool dans mon code?

Pour citer les Javadocs, newFixedThreadPool() :

Crée un pool de threads qui réutilise un nombre fixe de threads …

Cela signifie que si vous demandez 2 threads, cela démarrera 2 threads et ne démarrera jamais 3. D’autre part, le newCachedThreadPool() :

Crée un pool de threads qui crée de nouveaux threads en fonction des besoins, mais réutilise les threads précédemment construits lorsqu’ils sont disponibles.

Dans votre cas, si vous n’avez que 2 threads à exécuter, l’un ou l’autre fonctionnera correctement car vous ne soumettez que 2 jobs à votre pool. Toutefois, si vous souhaitez soumettre les 20 tâches en une fois, mais que deux tâches seulement sont exécutées simultanément, vous devez utiliser newFixedThreadPool(2) . Si vous avez utilisé un pool en cache, chacun des 20 jobs démarrera un thread qui s’exécutera en même temps, ce qui peut ne pas être optimal selon le nombre de processeurs que vous avez.

En général, j’utilise le newCachedThreadPool() lorsque j’ai besoin que le thread soit généré immédiatement, même si tous les threads en cours d’exécution sont occupés. Je l’ai récemment utilisé quand j’étais en train de créer des tâches de timer. Le nombre de travaux simultanés est sans importance, car je ne génère jamais beaucoup, mais je veux qu’ils s’exécutent lorsqu’ils sont demandés et que je souhaite qu’ils réutilisent les threads inactifs.

J’ai utilisé newFixedThreadPool() lorsque je veux limiter le nombre de tâches simultanées s’exécutant à un point donné afin d’optimiser les performances et de ne pas saturer mon serveur. Par exemple, si je traite 100 000 lignes à partir d’un fichier, une ligne à la fois, je ne veux pas que chaque ligne démarre un nouveau thread, mais je souhaite un certain niveau de concurrence. tâches jusqu’à ce que la piscine soit épuisée.