Glop,
J'ai un petit problème avec une application utilisant des threads. J'ai un objet, thread de son état, qui contient une liste chainée (LinkedList) dans laquel on stock, via appelle à sa méthode synchronized addThis, un élement (ici un String[]) qu'il doit traiter dans son run.
Le problème est que mon thread traite moins vite les données que l'on lui en fourni. Conséquence logique, j'abouti à une OutOfMemoryError de la JVM.
Sachant qu'en aucun cas le thread appelant ce thread ne doit être ralenti, comment puis-je mettre en place un système de gestion du tampon afin d'éviter ces problèmes de mémoire?
Actuellement le fonctionnement est "j'ajoute en début de LinkedList un élément, je sors le dernier". Sachant que les données ne sont pas critiques (il s'agit de traces applicative), un système de suppression des derniers éléments semble approprié. Comment le mettre en oeuvre?
Voilà la solution, plusieurs consommateurs, une seule file d'attente. Plus une URL sympa :
http://www-106.ibm.com/developerworks/libr...html?ca=dnt-524CODE |
import java.util.*;
public class PoP { static class Consumer extends Thread { protected static LinkedList queue = new LinkedList();
public void run() { String[] data;
try { while (true) { if (queue.size() > 0) { synchronized (queue) { data = (String[]) queue.removeLast(); } System.out.println(data + " [" + System.currentTimeMillis() + "]"); data = null; } else { Thread.sleep(700); } } } catch (InterruptedException ie) { } }
public static void add(String[] data) { synchronized (queue) { queue.addFirst(data); } } }
static class Producer extends Thread { public void run() { for (int i = 0; i < 100000; i++) { Consumer.add(new String[] { "1", "2", "3", "4", "5" }); } } }
public static void main(String[] args) { for (int i = 0; i < 25; i++) { Consumer c = new Consumer(); c.start(); }
for (int i = 0; i < 250; i++) { Producer p = new Producer(); p.start(); } } }
|