Olá, hoje aprenderemos sobre a interface Runnable, entre outras utilidades com ela poderemos implementar um código mais enxuto, separando as partes. E mais importante para nós em Java, poderemos trabalhar com objetos. Visto que dá forma como implementamos as threads nos dois últimos tutorias não é possível instanciá-la como fazemos com os objetos. Ou seja, não sendo possível trabalhar com a thread em outros locais.

Dessa forma, a interface Runnable é essencial em termos de implementação de objetos que serão executados de forma encadeada. É interessante, pois ela define um único método run(), e como sabemos, trata-se do método responsável pela execução dos códigos, neste caso dos códigos encadeados.

Temos implementadas duas threads, simulando respectivamente rotinas de envios de e-mail e nota fiscal. Ambas apresentam a mesma estrutura. Isto é, uma new thread seguida da instrução .start(), responsável por ligar a thread ao código que será processado em segundo plano.

New Thread(){
}.start();

No corpo das threads implementamos a rotina de envio de e-mai em uma e de envio de nota fiscal na segunda, porém, as duas rotinas são cada uma implementada dentro do seu próprio método run(). Ele será o responsável pelo disparo das rotinas, pela execução delas.

public void run(){
for(){
}
}

Porém cada uma dessas rotinas no laço for traz implementada dentro de um try/catch a thread sleep, que determina o tempo de resposta para o envio de cada uma.

try {
Thread.sleep(2000);
}catch(InterruptedException e){
e.printStackTrace();
}

O ponto interessante é que como se trata da implementação de duas threads poderíamos ter a situação em que uma thread demoraria um pouco mais em sua execução do que a outra. Neste caso, a thread concorrente assumiria o lugar, é o que chamamos de processamento em paralelo e concorrente.

IMPLEMENTANDO O RUNNABLE

Então, fora do método principal, no final do código iremos implementar a interface Runnable. Ela terá visibilidade privada, pois será visível somente dentro da classe. Seguindo a interface Runnable definiremos uma variável thread1 que receberá a instancia de um runnable, que automaticamente implementará o método run().

private static Runnable thread1 = new Runnable(){
public void run(){
}
};

Agora copiaremos dentro do run(), todo o código que simula a rotina de envio de e-mail. Feito isso apagaremos o código que ficou deixando tão somente o new Thread. Porque é a partir dela que iremos chamar a thread1. Observe que a thread apresenta agora alguns construtores, entre os quais Runnable.

Clique sobre o construtor Runnable, assim, dessa forma poderemos chamar a thread1. O que nos permitirá trabalhar com ela como um objeto.

Thread threadEmail = new Thread (thread1);
threadEmail.start();

E assim, poderemos além de dar o start, destruir, ver se a thread está ativa, pará-la, enfim, inúmeras possiblidades.

Para implementarmos a thread que simula o envio de notas fiscais, procederemos da mesma forma. Porém distinguindo um método do outro a partir do nome da variável, neste caso a chamaremos de thread2.

Thread threadNotaFiscal = new Thread(thread2);
threadEnvioNF.start();

Ao executarmos o resultado idêntico ao da implementação anterior, a diferença é que agora estamos trabalhando as threads como sendo objetos manipuláveis.

EM POUCAS PALAVRAS

A grande vantagem de utilizarmos a interface Runnable é justamente a possiblidade de transformas a threads em objetos manipuláveis. O que amplia e muito as nossas possibilidades, e nos permite explorar diferentes recursos das threads. Espero que tenham gostado, eu fico por aqui, nos vemos nos próximos tutoriais.