¿Qué sucede si pasamos subprocesos en ejecutorService ejecutar llamada en Java multithreading
Vea estos dos ejemplos:
EJEMPLO 1
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
//work
for (int i = 0 ; i < 5 ; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
executorService.execute(thread1);
executeService.shutdown();
}
EJEMPLO 2
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Runnable() {
@Override
public void run() {
//work
for (int i = 0 ; i < 5 ; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
executeService.shutdown();
}
Los resultados son los mismos en ambos casos, pero un amigo mío de StackOverflow alexei-kaigorodov ( en esta pregunta ) dijo en un comentario que
"ExecutorService es una alternativa a treads. No tiene sentido poner subprocesos en ejecutorService. Primero, cree Runnable, y luego póngalo como parámetro en un subproceso e inicie ese subproceso o envíe ese ejecutable a un ejecutorService".
Espero ser claro con mi pregunta, así que dígame la diferencia entre pasar ejecutable a ExecuteService y pasar hilo a ExecutableService.
Respuestas
Thread implements Runnablepor lo que el servicio de excutor lo aceptará como simple Runnabley, por lo tanto, llamará al Thread.run()método.
Lo que significa que el Threadmismo nunca se iniciará, a menos que usted mismo llame a su start()método, en cuyo caso el resultado es definitivamente indefinido.
Entonces, podría decir que los fragmentos se comportan de la misma manera, solo está pasando un Runnablea ExecutorServicey que luego lo ejecuta llamando al Runnable.run()método.