2009-12-25 16 views

Respuesta

28

Conductualmente, casi nada.

Sin embargo, una vez que tenga una instancia Executor, puede enviar varias tareas a la misma y ejecutarlas una tras otra. No puedes hacer eso simplemente con un Thread crudo.

+0

Oh sí, eso es, ni siquiera pensé en eso. Gracias. –

11

Si un error o una RuntimeException es echada en el ejecutor que será absorbida en silencio, el nuevo hilo() lo imprimirá a System.err

15

Una diferencia notable, es cuando se ejecuta new Thread(someRunnable).start(); Una vez finalizada la ejecutable el hilo morirá silenciosamente.

El ejecutor persistirá hasta que lo apague. Ejecutando Executors.newSingleThreadExecutor().execute(command) Cuando crea que su aplicación o la JVM pueden estar terminadas, el Ejecutor aún puede estar ejecutándose en una cadena de fondo.

+0

Aparentemente no es el caso: https://www.farside.org.uk/201309/learning_from_bad_code – assylias

+0

Interesante, no puedo discutir mucho de lo que dice. No puedo volver a crear la llamada 'finalize' después de que 'submit' finalice. Ejecuté una prueba simple 'principal' y la delegación de TPE nunca es GC'd. –

+0

No lo he probado para ser honesto. – assylias

0

Executors.newSingleThreadExecutor(). Execute (comando) reutilizará thread construido previamente, no creará un nuevo hilo como en el caso de un nuevo Thread(). Si el hilo que no se ha usado durante sesenta segundos se termina, es un tipo de grupo que contiene un único hilo que hace su equivalente newFixedThreadPool (1).

0

Prefiero usar ExecutorService o ThreadPoolExecutor incluso para hilos de un solo dígito. Ofrecen más flexibilidad.

Tener un vistazo a ExecutorService & ThreadPoolExecutor secciones de preguntas relacionadas SE:

java Fork/Join pool, ExecutorService and CountDownLatch

Java's Fork/Join vs ExecutorService - when to use which?

supone que ha comenzado con su propio hilo en lugar de ExecutorService. En el futuro, si existe la necesidad de admitir varios hilos, ExecutorService o ThreadPoolExecutor ofrecerán un mejor control y flexibilidad para usted. Puede ajustar el número requerido de parámetros en estas API a continuación.

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, 
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, 
RejectedExecutionHandler handler)