o que acontece se passarmos threads em executorService executar chamada em multithreading Java

Oct 08 2020

Veja estes dois exemplos:

EXEMPLO 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();
}

EXEMPLO 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();
    }

Os resultados são os mesmos em ambos os casos, mas um amigo meu do StackOverflow alexei-kaigorodov ( nesta questão ) disse em um comentário que

"executorService é uma alternativa para treads. Não faz sentido colocar threads em executorService. Primeiro, crie Runnable e, em seguida, coloque-o como um parâmetro para um thread e inicie esse thread ou envie esse executável para um executorService."

Espero ter sido claro com minha pergunta, então me diga a diferença entre passar runnable para ExecuteService e passar thread para ExecutableService.

Respostas

2 Lino Oct 08 2020 at 11:36

Thread implements Runnableportanto, o serviço de excutor o aceitará como um método simples Runnablee, assim, chamará o Thread.run()método.

O que significa que o Threadpróprio nunca será iniciado, a menos que você mesmo chame seu start()método, caso em que o resultado é definitivamente indefinido.

Então você poderia dizer que os snippets se comportam da mesma forma, você está apenas passando um Runnablepara o ExecutorServicee que o executa chamando o Runnable.run()método.