Thread - Quando é executada?

13 respostas
E

Pessoal, na linha 26 eu uso o método execute da classe ExecutorService e passo um Runnable para ele como argumento. Na linha 27, faço o mesmo. A minha dúvida está em quando essas threads são iniciadas. Na documentação do Java, é dito o seguinte para execute:

Executes the given command at some time in the future.

Entendi que esse comando será executado em uma thread futuramente, ou seja, não imediatamente.

Em executor.shutdown, a documentação diz:

Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted.

Entendi que as threads que já foram criadas pelo pool são executadas agora e assim que terminadas, encerradas. Elas tinham sido criadas para serem executadas futuramente. Agora é a hora de executar! Entretanto, não serão aceitas novas tarefas, ou seja, depois desse comando shutdown, não é aceito mais instruções executor.execute(…).

Nas linhas 26 e 27, duas threads são criadas e estão no estado de novo. Elas ainda não estão prontas.
Na linha 29, essas threads são colocadas no estado de pronto através de executor.execute(). A ordem de execução das threads dependerá do Sistema Operacional, já que não defini prioridade.

E sequência de acontecimentos é essa mesma? Peço que me corrijam, caso eu esteja enganado!

Obrigado!

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ClasseThread implements Runnable{
	
	private int tempo;

	public ClasseThread(int tempo){
	
		this.tempo = tempo;
	}
	
	public void run(){
		
		try{
			Thread.sleep(tempo);		
		}
		
		catch(InterruptedException e){}
	}
	
	public static void main(String[] args) {
		
		ExecutorService executor = Executors.newCachedThreadPool();
		executor.execute(new ClasseThread(1000));
		executor.execute(new ClasseThread(500));
		
		executor.shutdown();
	}

}

13 Respostas

M

Não podemos prever a ordem que as threads serão executadas. Não há garantia nenhuma. O mecanismo responsável por alocar as threads (agendador) é quem decide quem vai entrar em execução (ou sair, ou esperar). A única coisa que podemos ter certeza é que cada thread será iniciada e executada até a sua conclusão.

E

Tá, mas as threads são criadas (estado de novo) e colocadas no estado de pronto. O que disse acima está correto?

M

Sim, quando você cria uma thread e chama o start() ela está no estado Pronto. Isso quer dizer que a qualquer hora ela poderá assumir a cpu e ser executada.

E

Eu não usei Thread.start()
Eu queria saber sobre os comandos execute() e shutdown(). Você fez a gentileza de ler o meu post?

M

Eu não usei Thread.start()
Eu queria saber sobre os comandos execute() e shutdown(). Você fez a gentileza de ler o meu post?

Como você mesmo disse:
execute() = Vai executar a thread em algum momento no futuro.
shutdown() = nao aceita mais threads para o executor e finaliza as que estiverem na fila

An unused ExecutorService should be shut down to allow reclamation of its resources.

E

Eu não usei Thread.start()
Eu queria saber sobre os comandos execute() e shutdown(). Você fez a gentileza de ler o meu post?

Como você mesmo disse:
execute() = Vai executar a thread em algum momento no futuro.
shutdown() = nao aceita mais threads para o executor e finaliza as que estiverem na fila

An unused ExecutorService should be shut down to allow reclamation of its resources.

Eu continuo com a dúvida sobre os estados da thread com esses comandos na main.

O ExecutorService gerencia a criação de threads. Contudo, essa criação somente ocorre quando um método execute() é encontrado. Imagino que quando o método execute() é encontrado, ExecutorService cria uma nova thread (ou usa uma já existente), colocando-a no estado de novo.

Lendo o que significa shutdown(), percebo que esse comando apenas encerra as threads conforme elas vão terminando os seus serviços, na ordem de chamada. Com isso, para mim, está faltando o estado de pronto, que estaria entre o comando execute() e shutdown(). Nesse intervalo, o Sistema Operacional aloca memória para essas threads e as coloca na fila de pronto?

Obrigado!

G

como ta a implementação do metodo execute?

R

O problema é que você não está dando tempo das trhreads executarem, pois assim que você agenda a execução você chama o shutdown(). Se você fizer:

public static void main(String[] args) {  
          
      ExecutorService executor = Executors.newCachedThreadPool();  
      executor.execute(new ClasseThread(1000));  
      executor.execute(new ClasseThread(500));  

      executor.awaitTermination( 2000, TimeUnit.MILLISECONDS ); //espera a execução das Threadas agendadas
          
      executor.shutdown();  
}

acho que vai funcionar.

E

rmendes08:
O problema é que você não está dando tempo das trhreads executarem, pois assim que você agenda a execução você chama o shutdown(). Se você fizer:

public static void main(String[] args) {  
          
      ExecutorService executor = Executors.newCachedThreadPool();  
      executor.execute(new ClasseThread(1000));  
      executor.execute(new ClasseThread(500));  

      executor.awaitTermination( 2000, TimeUnit.MILLISECONDS ); //espera a execução das Threadas agendadas
          
      executor.shutdown();  
}

acho que vai funcionar.

@rmender08

No meu código original, tem esse trecho de espera que vc postou.

Bem, a minha dúvida é com relação aos estados das threads.

Quando eu crio um ExecutorService, estou criando um gerenciador de threads, que as criam e as gerenciam. Porém, as thread, pelo meu entendimento, somente serão criadas quando o método execute() for invocado. Eu acredito que as chamadas ao método execute() levam as threads ao estado novo, pois a documentação de execute() diz que as threads serão executadas futuramente.

Em shutdown(), elas terminam na ordem de chamada. Assim, entre esses dois métodos (chamada de execute() e chamada e shutdown()), as threads saem do estado de novo e vão para o estado de pronto. Nesse intervalo de chamada dos métodos, o sistema operacional aloca memória para as threads e as coloca na fila de pronto.

Gostaria que me corrigissem, caso eu esteja enganado em qualquer parte dessa minha “história”.

Obrigado!

E

O método execute faz parte do Java!

G

O método execute faz parte do Java.

sim

mas se vc olhar lá, vc nota facilmente como ele funciona.

é melhor q ver conjecturas.

E

Alguém?

E

rmendes08:
O problema é que você não está dando tempo das trhreads executarem, pois assim que você agenda a execução você chama o shutdown(). Se você fizer:

public static void main(String[] args) {  
          
      ExecutorService executor = Executors.newCachedThreadPool();  
      executor.execute(new ClasseThread(1000));  
      executor.execute(new ClasseThread(500));  

      executor.awaitTermination( 2000, TimeUnit.MILLISECONDS ); //espera a execução das Threadas agendadas
          
      executor.shutdown();  
}

acho que vai funcionar.

Há uma inversão com relação aos comandos execute.awaitTermination e executor.shutdown. O primeiro vem depois de shutdown, já que o bloqueio da thread main ocorre depois que um shutdown ocorre.

Aliás, alguém poderia averiguar se o que eu disse está correto no post original?

Criado 14 de março de 2012
Ultima resposta 17 de mar. de 2012
Respostas 13
Participantes 4