Je dispose d'un serveur Java qui traite les images comme dans les pages Web demandées par le client.Pool d'exécuteurs dans un serveur Java
Maintenant, le traitement de ces images nécessite du temps et de la mémoire et n nombre de threads entrant dans les images de traitement bloque le serveur.
Maintenant, pour éviter la situation du code qui traite les images, je les ai placées dans une classe Runnable et les appelez à partir d'un pool d'exécuteurs.
Ma question est si l'implémentation ci-dessous est une bonne approche pour exécuter le pool Executor dans un serveur.
L'être de classe Runnable -
public class MyRunnable implements Runnable {
private final String id;
MyRunnable(String tid) {
this.id = tid;
}
@Override
public void run() {
NewAlbumImage nai = new NewAlbumImage();
nai.save_image(id,false);
}
}
Le code qui gère la classe Runnable est comme ci-dessous -
newa.NewClass newca = new newa.NewClass();
Runnable mr = new MyRunnable(id);
newca.executor.execute(mr);
La classe NewClass a une variable d'exécuteur testamentaire statique -
static ExecutorService executor;
Je m initialise la variable d'exécuteur au démarrage d'applictation de Web et détruit la même à l'application web close -
public class AppNameServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Initializing Executor Pool");
NewClass nc = new NewClass();
nc.executor = Executors.newFixedThreadPool(10);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
NewClass nc = new NewClass();
nc.executor.shutdown();
try {
nc.executor.awaitTermination(10L, TimeUnit.MINUTES);
} catch (InterruptedException ex) {
System.out.println("Executor Pool await Termination exception");
}
}
}
Si j'arrête l'exécuteur, où dois-je l'initialiser? –
Je dis que les champs statiques est préférable d'être invoqué par le nom de classe, pas créer une nouvelle instance de classe, qui rendra les gens confus :) 'NewClass.executor = Executors.newFixedThreadPool (10);' 'newFixedThreadPool()' est un static méthode usine, il va initialiser une nouvelle instance 'ExecutorService' pour vous. – haifzhan
Si 10 threads (demandes de page) initialisaient la même variable statique et s'exécutaient et s'arrêtaient, cela ne causerait-il pas de problèmes? –