2009-10-04 13 views
11

Tengo un objeto MyThread que crea una instancia cuando mi aplicación se carga a través del servidor, la marco como un hilo de Daemon y luego llamo al start(). El hilo está destinado a sentarse y esperar la información de una cola, siempre que la aplicación esté activa. Mi problema/pregunta es este: actualmente MyThread está extendiendo Thread porque lo marco como Daemon y leo cómo es más preferible implementar Runnable y usar ejecutores. Entonces, lo que quería preguntar es si MyThread implementará Runnable en lugar de extender Thread (y por supuesto será renombrado) y usaré newSingleThreadScheduledExecutor() cómo, qué o tal vez dónde, marque algo como Daemon. Espero no haber hecho un lío de términos, discúlpeme si tengo algunas partes del entorno de subprocesamiento múltiple que son muy nuevas para mí.Ejecutor y Daemon en Java

Gracias Itai

Actualización: El módulo que me refiero en mi aplicación es una aplicación Web que tiene unos hilos realidad de este tipo y lo que tienen en común es que todos en que el ServletContext como miembro por varias razones. Actualmente extiendo Thread a WebThread que tiene el ServletContext como memebr y todas las subclases pueden utilizar esto. Si me cambio al paradigma Runnable con el Ejecutor y ThreadFactory, básicamente necesito tener un feo híbrido de WebRunnable que implemente Runnable y tenga ServletContext como miembro público y haga que mi ThreadFactory implemente newThread(WebRunnable arg0) además de newThread(Runnable arg0). No estoy seguro de qué es lo mejor. Gracias

Respuesta

12

Si está utilizando un ejecutor programado, puede proporcionar un ThreadFactory. Esto se usa para crear nuevos Hilos, y usted puede modificarlos (por ejemplo, hacerlos Daemon) como lo requiera.

EDIT: Para responder a su actualización, su ThreadFactory sólo tiene que poner en práctica newThread(Runnable r) desde su WebRunnablees unaRunnable. Entonces no hay trabajo extra.

+0

+1 para corrección técnica, pero ¿hay alguna ventaja en el uso de Executor en este contexto? Parece un poco de "complejidad por la complejidad" para mí (pero tal vez estoy equivocado en esto ...) – hjhill

+0

Quizás no. Pero he escrito sistemas antes de los cuales utilizo un único ejecutor de hilos para empezar, y enchufé diferentes ejecutores en una etapa posterior. –

+0

@ Brian- Estoy pensando en lo que está pensando hjhill. Tengo un hilo como tal y no estoy seguro de si vale la pena el problema al utilizar ThreadFactory – Ittai

23

Salida del Javadoc para newSingleThreadScheduledExecutor(ThreadFactory threadFactory)

Se pondría en práctica algo como esto:

public class MyClass { 
    private DaemonThreadFactory dtf = new DaemonThreadFactory(); 
    private ScheduledExecutorService executor = 
           Executors.newSingleThreadScheduledExecutor(dtf); 
    // ....class stuff..... 
    // ....Instance the runnable..... 
    // ....submit() to executor.... 
} 

class DaemonThreadFactory implements ThreadFactory { 
    public Thread newThread(Runnable r) { 
     Thread thread = new Thread(r); 
     thread.setDaemon(true); 
     return thread; 
    } 
} 
+0

Hola Stu, antes que nada, gracias por tu respuesta detallada, pero no estoy seguro de que hayas visto mi actualización. Actualicé la pregunta con el hecho de que necesito que 'Threads/Runnables' tenga un objeto de' ServletContext' cuando se ejecuta y me pregunto cómo se puede lograr con Runnable. Sé que con la herencia de 'Thread' no es problema enchufarlo en' ThreadFactory', pero no estoy seguro de si es posible con el paradigma Runnable. – Ittai

+0

Ah, no, no lo hice: P * (Abrí tu pregunta para responder, pero me tomé mi tiempo para hacerlo.) * Déjame pensar un poco y ver la otra respuesta ... –

+0

Lo que decidí hacer (se puede cambiar) es tener una clase 'singleton' que tenga' commonResourcesMap' que será '' y servirá como ese recurso común para servlets y no-servlets. De esa forma puedo implementar 'Runnable' sin ningún problema. – Ittai

2

Sólo para complementar con otra posible solución para la integridad. Aunque puede que no sea tan lindo.

final Executor executor = Executors.newSingleThreadExecutor(); 
Runtime.getRuntime().addShutdownHook(new Thread() { 

    @Override 
    public void run() { 
     executor.shutdownNow(); 
    } 
});