2010-03-02 11 views

risposta

0

corri, perché non si aggiunge il comportamento specializzato per la classe Thread - si sono semplicemente selezionare tutti i tuoi logica ad essere in grado di essere eseguito come proprio thread.

9

si dovrebbe fare Runnable, e poi aggiungerlo a una delle classi di pool di thread esistenti. Stai incapsulando la tua unità di lavoro nella nuova classe e quindi utilizzando il thread per eseguirlo.

Si dovrebbe solo estendere Thread se si stesse facendo qualcosa per la classe filo stesso, come ad esempio l'estensione con nuove funzionalità. Dubito che sia così.

Un'alternativa sarebbe quella di fare una nuova classe che era una composizione di filo e la tua logica personalizzata, ad esempio, ha un Thread interno e un proprio metodo 'execute()' in cui pianifica il thread e aggiunge (questo) come un oggetto di lavoro, completamente nascosto dall'esterno ... Ma in tal caso si farebbe comunque la classe Runnable, solo fornendo un metodo comodo per renderlo più facile aggiungerlo a un thread.

1

Instantiating Runnable fornisce una separazione più pulita tra il codice e l'implementazione dei thread. L'interfaccia Runnable afferma semplicemente che è possibile eseguire questo codice in un thread diverso.

Inoltre, dal momento che è possibile implementare molte interfacce ma estendere solo una classe, è possibile fornire la propria superclasse solo implementando Runnable. Se estendi Thread, non puoi avere alcuna altra superclasse.

L'unica avvertenza con Runnable è che è necessario due oggetti, un'istanza di discussione ad eseguire in realtà il codice e uno della vostra implementazione di Runnable di fornire il codice.

2

Se si estende Thread, è sempre necessario chiamare .start(), che avvia un nuovo thread ed esegue l'attività.

Se lo rendi Runnable, puoi anche fare un nuovo Thread (eseguibile) .start(), ma non sei limitato a quello. È possibile riciclare le discussioni, risparmiando in tal modo alcune risorse in questo modo:

ExecutorService recycleSingleThread = Executors.newSingleThreadExecutor(); 
service.execute(runnable); 
service.execute(someOtherTask); 

mettere un po 'di vostri runnables in un elenco e poi eseguirli quando ci si sente come loro esecuzione:

List<Runnable> todoList = new ArrayList<Runnable>(); 
Runnable fetchPaper = new Runnable("paper"); 
todoList.add(fetchPaper); 
Runnable fetchMilk = new Runnable("milk"); 
todoList.add(fetchMilk); 

//do something else or even return todoList... 
ExecutorService recycleSingleThread = Executors.newSingleThreadExecutor(); 
for(Runnable task : todoList){ 
    recycleSingleThread.execute(task); 
} 

Oppure si può anche fare

runnable.run(); 

all'interno della propria discussione.

Forse si potrebbe anche risparmiare un eseguibile, de-serializzare in seguito ed eseguirlo.
Tutta questa flessibilità non sarà presente se estenderei Thread.

Problemi correlati