L’idée de faire des threads sur une application web vient du fait que les processeurs des serveurs sous souvent sous-utilisés (je dirais en moyenne 20%), et donc on pourrait gagner en rapidité des applications en mettant davantage de threads, plutôt qu’en augmentant les capacités des processeurs. Voilà donc rapidement comment faire des threads en Java.
D’abord on va isoler le code à threader. Pour cela, on créera une classe java, comme celle-ci par exemple :
public class LongCompute extends Thread{ private Long monLong; LongCompute (Long monLong){ this.monLong = monLong; } public void run() { monLong++; } }
L’idée est ici réellement d’avoir un code seulement dépendant du contexte qui lui aura été passé. Notez que cette classe doit étendre de la classe Thread.
Ensuite, on va appeler ce code depuis une méthode, présente dans une autre classe :
for (Long monLong : collectionLong) { Thread th = new LongCompute(monLong); threadList.add(th); th.start(); } for(Thread th : threadList) try {th.join();} catch(Exception e) {} }
Sachant que la technique ci-dessus les démarre tous à la suite, et les joints tous à la fin. Compliqué et risqué si le traitement de chaque thread est coûteux en temps et en mémoire !
D’où une autre méthode pour limiter le nombre de threads démarrés en parallèle.
for (Long monLong : collectionLong) { Thread th = new LongCompute(monLong); threadList.add(th); } Iterator<Thread> it = threadList.iterator(); asyncMethod(it);
Avec une méthode asyncMethod qui ressemblera à ceci :
private void asyncMethod(Iterator<Thread> it) { int i = 0; int MAX = 200; List<Thread> listTh =new ArrayList<Thread>(); while (it.hasNext() && i <= MAX) { Thread th = it.next(); listTh.add(th); th.start(); i++; } try { for (Thread thh : listTh) { thh.join(); } } catch (InterruptedException exception) {} if (it.hasNext()) { asyncMethod(it); } }
Un petit schéma pour mieux comprendre les threads :
Et voilà ! Pour les crédits : remerciements à Anthony L. pour le code de la asyncMethod. Le reste a été trouvé là.