2009-07-26 6 views
2

Je ne trouve pas de réponse sur leur site. Avez-vous une idée si HtmlCleaner est thread safe ou pas?
J'ai plusieurs threads qui ont besoin de l'utiliser mais je ne sais pas si je peux réutiliser en toute sécurité une instance de l'objet HtmlCleaner.
L'avez-vous déjà utilisé? une idée?Le thread HtmlCleaner est-il sécurisé?

+0

classes thread-safe d'écriture est un travail difficile . Je considère toujours que les classes ne sont pas thread safe, alors que l'auteur ne déclare pas explicitement les docs. Ce projet a un forum, je pense que vous obtiendrez une meilleure réponse, peut-être du développeur, là-bas. – PeterMmm

+1

Pourquoi voulez-vous le réutiliser? Java est OO et si vous avez besoin d'une instance de classe, créez-en une nouvelle en premier. Le GC va libérer de la mémoire pour vous. La réutilisation est appropiée dans très peu d'applications. – PeterMmm

Répondre

1

En regardant le code source, non - un objet HtmlCleaner n'est pas thread-safe. Utilisez un objet par thread.

-1

Mon expérience est non. J'ai utilisé HTMLCleaner pour plusieurs applications qui analysent régulièrement des lots de centaines de milliers d'URL et analysent par intermittence à la demande.

J'ai trouvé des anomalies dans l'analyse syntaxique et des exceptions sont levées sous charge avec plusieurs threads en utilisant un seul HtmlCleaner et DomSerializer. Je préfère réutiliser des objets autant que possible, il nécessite un peu plus de code à réutiliser sur la vie du thread mais si vous vous souciez de la vitesse et/ou de l'utilisation des ressources, la réutilisation des objets est logique.

Réutiliser au niveau du thread sans pool peut vous convenir si vos threads de travail sont toujours en vie, sous charge, et ils ne sont pas trop nombreux. Réutiliser avec un pool a du sens si vous créez constamment des threads (je ne le recommande pas), vos threads ne sont pas toujours en charge, il y a beaucoup de threads, ou les objets réutilisables ont un poids important sur le temps d'instanciation ou l'exécution de la consommation de ressources. Fondamentalement, une approche de pool permet à l'application d'augmenter le nombre d'objets réutilisables, garantit que vous avez seulement autant d'objets que votre système a besoin à un moment donné, gère la libération des ressources, et si une taille min est définir alors vous pouvez éviter tout retard de démarrage associé à la création de l'objet ... à un point.

Quoi qu'il en soit, j'ai tendance à travailler à grande échelle, donc ce type d'optimisation peut ne pas valoir le coup. Ma théorie est en cas de doute, utilisez une piscine.

3

Pour votre information, la dernière version prétend être:

http://htmlcleaner.sourceforge.net/javause.php#example2

final CleanerProperties props = new CleanerProperties(); 
final HtmlCleaner htmlCleaner = new HtmlCleaner(props); 
final SimpleHtmlSerializer htmlSerializer = 
    new SimpleHtmlSerializer(props); 

// make 10 threads using the same cleaner and the same serializer 
for (int i = 1; i <= 10; i++) { 
    final String url = "http://search.eim.ebay.eu/Art/2-1/?en=100&ep=" + i; 
    final String fileName = "c:/temp/ebay_art" + i + ".xml"; 
    new Thread(new Runnable() { 
     public void run() { 
      try { 
       TagNode tagNode = htmlCleaner.clean(new URL(url)); 
       htmlSerializer.writeToFile(tagNode, fileName, "utf-8"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 
} 
Questions connexes