[quote][quote=entanglement][quote=ECO2004]Olá, pessoal!
Estou com uma dúvida com relação à interface ExecuteService.
Essa interface possui a declaração de um conjunto de métodos que servem para gerenciar Execute.
O que não entendo é o seguinte.
Quando vou criar um pool de thread, faço:
ExecuteService threadExecutor = Executors.newFixedThreadPool(algumInteiro)
Mas ExecuteService é uma interface. Não entendi essa criação de “objeto” de interface (threadExecutor) e nem essa atribuição!
ExecuteService deriva de Execute. Assim, herda a declaração do método “execute”, usada para rodar as threads.
Para entenderem melhor a minha dúvida, seria normal ao meu ver ExecutorService ser uma classe e assim fazer threadExecutor.execute(Runnable r).
Espero ter sido claro![/quote]
Você está tendo um problema de Java, não de threads.
Variáveis não são a mesma coisa que objetos.
Variáveis podem ter um tipo (interface ou classe), e são posições de memória que guardam referências a objetos (mas não os próprios objetos;
Objetos devem ter uma classe, e é a classe que implementa interfaces.
Quando você declara “ExecutorService threadExecutor”, está indicando que você está declarando uma variável (ou seja, um espaço em memória que contém uma referência, cujo tipo é a interface ExecutorService).
Dessa forma, essa variável pode conter uma referência a qualquer objeto que pertença a uma classe que implemente a interface ExecutorService. Por exemplo, poderíamos ter:
ExecutorService threadExecutor = Executors.newFixedThreadPool (...); // este método retorna um objeto da classe ThreadPoolExecutor, que implementa ExecutorService
ExecutorService threadExecutor = Executors.newSingleThreadExecutor(...); // este método retorna um objeto da classe FinalizableDelegatedExecutorService
ExecutorService threadExecutor = Executors.newScheduledThreadPool(...); // este método retorna um objeto da classe ScheduledThreadPoolExecutor
Mas você, usando essa variável, não precisa saber a classe concreta desse objeto, se você só se limitar a chamar os métodos definidos pela interface. [/quote]
O que eu queria saber foi explicado aqui:
Bem, eu não sabia disso…
Obrigado.[/quote]
Uma vez eu tinha perguntado no GUJ para que servia uma variável do tipo Interface. Responderam, mas outra coisa…
Então quer dizer que eu posso ter uma interface que recebe a referência para qualquer classe que implemente a interface?
Olhando a documentação do Java:
public static ExecutorService newFixedThreadPool(int nThreads)
Verifica-se que o retorno do método newFixedThreadPool é ExecutorService, que é uma interface.
ExecutorService threadExecutor recebe essa referência.
threadExecute.execute(Runnable) //aqui reside a dúvida.
O normal para mim, é uma classe X implementar Execute, mais precisamente, o método execute.
Depois eu usaria esse execute() para executar as threads…
Onde está a implementação de execute? Está em “Executors.newFixedTheadPool(inteiro)”?
Ai threadExecutor receberia uma referência a uma classe que implementa execute, que no caso, é newFixedThreadPool(inteiro) ?
É isso que está acontecendo?