2010-10-26 12 views
7

Qualcuno ha qualche idea della storia del metodo run() della classe Thread di Java che è pubblico? Quasi sempre, viene utilizzato da override e quindi il modificatore protetto sarebbe stato più appropriato? Ciò lascerebbe comunque l'inizio() come api pubbliche per gli utenti e quindi non lascia spazio a errori con utenti che chiamano run() accidentalmente.Vantaggi del modificatore pubblico su Java Thread run()

risposta

10

Thread implementa Runnable, che definisce il metodo run(), quindi deve essere pubblico.

Ma poiché Java 1.5 è consigliabile utilizzare Executors services anziché java.lang.Thread. Gli esecutori stanno disaccoppiando l'unità di lavoro da eseguire (Runnable, Callable) dall'attuale esecutore. (Con Thread erano la stessa cosa)

+0

Sì, hai ragione e penserei che sia per questo che run() è lì come metodo pubblico. Infatti, dal momento che c'è un costruttore che accetta un argomento Runnable - Thread pubblico (Target eseguibile), che avrebbe dovuto annullare la necessità di implementare Runnable? – gshx

+0

"NON è consigliabile"? non il contrario? :-) –

+0

grazie. un extra 'not' :) rimosso. – Bozho

2

run è definito nell'interfaccia Runnable e tutti i metodi definiti in un'interfaccia sono pubblici.

+0

Grazie, ma avrei dovuto aggiungere qualche altro nella mia domanda: Thread ha davvero bisogno di implementare Runnable quando fa tutto il suo lavoro sul target Runnable iniettato al suo interno? – gshx

3

È meglio non sovrascrivere Thread, è necessario creare un Runnable e passarlo nel costruttore per il nuovo Thread. In questo modo il lavoro svolto, il Runnable, viene tenuto separato dal meccanismo di implementazione, il Thread.

+0

Nathan, sono d'accordo con te ed è per questo che mi chiedo perché è lì in primo luogo - qual è l'uso di Thread che implementa Runnable quando la classe Thread ha già un costruttore che accetta un Runnable che esegue l'override di run() – gshx

+0

@gshx : Bella domanda, suppongo che sia fornita come scorciatoia. –

1

Penso che sia fondamentalmente un cattivo progetto che, nell'interesse di rendere le cose "semplici" per l'utente, consentiva di accoppiare il task da eseguire (il Runnable) al thread per eseguirlo direttamente. Dal momento che Thread è stato aggiunto in JDK 1.0, tuttavia, da quel momento il design non è stato più in grado di essere modificato, solo deprecato (in ordine di sorta) a favore del framework Executor. JDK 1.0 è stato molto tempo fa e da allora sono stati commessi vari errori senza il beneficio dell'esperienza.

+0

In realtà sono favorevole alla deprecazione di run() su Thread con un suggerimento per utilizzare invece gli executors.È chiaramente impossibile proteggerlo ora. – gshx

Problemi correlati