Help - Search - Member List - Calendar
Full Version: [java] Problème Avec Une Liste Chainée
OpenSpace > Zone Ordinateurs > Programmation
PoP
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?
Gfx
cf pcteam
Gfx
Voilà la solution, plusieurs consommateurs, une seule file d'attente. Plus une URL sympa : http://www-106.ibm.com/developerworks/libr...html?ca=dnt-524

CODE

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();
   }
 }
}




This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2024 Invision Power Services, Inc.