2016-01-22 18 views
16

So che implements Runnable is preferred over extends Thread in thread Java poiché ci consente di estendere qualche altra classe se è richiesta. Ma se questo è il caso, anche extends Thread ha i suoi vantaggi rispetto a implements Runnable e se sì, quali sono questi vantaggi?Perché "extends Thread" esiste, quando "implements Runnable" è il vincitore in tutti i casi

+4

@proudandhonour: Sì, ho letto la risposta a questa domanda, ma tutte le risposte spiegano come "gli strumenti eseguibili" sono buoni. E in realtà quelle risposte hanno creato questa domanda nella mia mente. – rahul

+1

@proudandhonour ti dispiacerebbe collegare alla risposta che risponde a questa domanda? Non sembra nei primi. – djechlin

+0

considera lo scenario, all'avvio del thread, vuoi aggiungere i dettagli di quel particolare thread al DB. Questo è diverso dalla logica di business che hai nel metodo run(), quindi vuoi tenerlo separato. Quindi, sostituirai sia il metodo start() che run() –

risposta

30

Perché a volte (quasi mai, ma a volte) si desidera poter modificare il comportamento di base di Thread.

Ecco quando è necessario estenderlo.

È possibile modificarlo annullando un metodo dalla classe Thread, non è possibile farlo implementando uno da Runnable.

+6

Esempio [qui] (http://stackoverflow.com/questions/34905333/in-run-method-how-to-find-from-where-start- was-called/34905821 # 34905821) - asker voleva sapere quale thread ha creato/iniziato questa discussione. Sostituisce il costruttore e 'avvia' per farlo. – OldCurmudgeon

18

Negli ultimi 20 anni da quando è stato rilasciato Java 1.0, ciò che è considerato un buon modello di progettazione è cambiato. Tuttavia, Java si impegna a garantire la compatibilità con le versioni precedenti, il che significa che il vecchio codice che potrebbe utilizzare modelli di progettazione scadenti continuerà a funzionare.

Uno dei miei pet odia è StringBuffer per il quale non è mai stata una buona idea rendere il metodo sincronizzato, è stato sostituito più di dieci anni fa, ma sfortunatamente agli sviluppatori non è impedito di utilizzarlo oggi e anche i nuovi sviluppatori lo usano, anche se è stato deprecato molto tempo prima che iniziassero ad usare Java.

+2

la scelta tra il blocco dei runnables e dei thread non ha nulla a che fare con i "pattern di progettazione", che non ha alcun senso. Si tratta di due scenari di casi d'uso diversi – specializt

+0

Gli schemi di progettazione sono composizione vs ereditarietà. Quali sono i due diversi casi d'uso che hai in mente. La sottoclasse 'Thread' è * molto raramente * circa l'override di qualsiasi cosa eccetto' run() ' –

+0

sembra che un' Runnable' sia in qualche modo collegato a un 'Thread'. Beh, non lo è. Affatto. I runnables stanno bloccando, gli algoritmi eseguibili e i thread sono asincroni e indipendenti, che possono ancora essere eseguiti molto tempo dopo che il thread chiamante è terminato. Per favore non scrivere risposte su argomenti che ti sono estranei, grazie mille. Questa domanda potrebbe essere riformulata in "Cosa è meglio: colture GM o l'ultima stagione di rottura del male?" _ --- non calcola. – specializt

Problemi correlati