2009-10-04 24 views
11

Ho un oggetto MyThread che istanzio quando la mia app viene caricata attraverso il server, la contrassegno come thread Daemon e quindi chiamo start() su di essa. Il thread è pensato per sedersi e attendere le informazioni da una coda finché l'applicazione è attiva. Il mio problema/domanda è questa: Attualmente MyThread sta estendendo Thread perché lo contrassegno come Daemon e leggo su come è più preferibile implementare Runnable e usare Executor. Quindi quello che volevo chiedere è se MyThread implementerà Runnable invece di estendere Thread (e ovviamente verrà rinominato) e userò newSingleThreadScheduledExecutor() come, cosa o forse dove, contrassegnerò qualcosa come Daemon. Spero di non aver fatto un pasticcio di termini, per favore scusami se ho come alcune parti dell'ambiente di multithreading sono molto nuove per me.Executor e Daemon in Java

Grazie Ittai

Update: Il modulo mi riferisco al mio app è una web-app, che ha un paio di discussioni in realtà di questo tipo e ciò che essi hanno in comune è che tutti in il ServletContext come membro per vari motivi. Attualmente estendo Thread a WebThread che ha il ServletContext come memebr e tutte le sottoclassi possono utilizzarlo. Se passo il paradigma Runnable con Executor e ThreadFactory di base ho bisogno di avere un brutto ibrido di WebRunnable che implementa Runnable e ha il ServletContext come membro pubblico e ho il mio implementare newThread(WebRunnable arg0) oltre a newThread(Runnable arg0). Non sono sicuro di cosa sia meglio. Grazie

risposta

12

Se si sta utilizzando un esecutore pianificato, è possibile fornire un ThreadFactory. Questo è usato per creare nuovi Thread, ed è possibile modificarli (ad esempio, renderli demone) come richiesto.

EDIT: Per rispondere alla tua aggiornamento, il ThreadFactory ha solo bisogno di implementare newThread(Runnable r) dal tuo WebRunnableè unRunnable. Quindi nessun vero lavoro extra.

+0

+1 per correttezza tecnica - ma c'è qualche vantaggio nell'utilizzo di Executor in questo contesto? Sembra un po 'di "complessità per la complessità" per me (ma forse mi sbaglio su questo ...) – hjhill

+0

Forse no. Ma ho scritto sistemi prima dei quali utilizzare un esecutore a thread singolo per iniziare e collegato a diversi executor in una fase successiva. –

+0

@ Brian- Sto pensando a cosa sta pensando hjhill. Ho un thread in quanto tale e non sono sicuro che valga la pena di utilizzare il ThreadFactory – Ittai

23

Partenza JavaDoc per newSingleThreadScheduledExecutor(ThreadFactory threadFactory)

Si sarebbe stato attuato qualcosa di simile:

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

Ciao Stu, innanzitutto grazie per la tua risposta dettagliata ma non sono sicuro che tu abbia visto il mio aggiornamento? Ho aggiornato la domanda con il fatto che ho bisogno del mio 'Thread/Runnables' per avere un oggetto di' ServletContext' quando viene eseguita l'esecuzione e mi chiedo come questo possa essere completato con Runnable. So che con l'ereditarietà di 'Thread', non è un problema collegarlo a' ThreadFactory', ma non sono sicuro se o come sia possibile con il paradigma Runnable. – Ittai

+0

Ah, no, non l'ho fatto: P * (ho aperto la tua domanda per rispondere ma ho impiegato il mio tempo per arrivarci). Lasciami pensare un po 'e dare un'occhiata all'altra risposta ... –

+0

Cosa ho deciso fare (può essere cambiato però) è avere una classe 'singleton' che ha un' commonResourcesMap' che sarà '' e servirà come risorsa comune per servlet e non-servlet. In questo modo posso implementare 'Runnable' senza problemi. – Ittai

2

Proprio per integrare con un altro possibile soluzione per completezza. Potrebbe non essere così carino però.

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

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