O que e uma thread ?Thread pode ser definida como um fluxo sequencial de execucao de um programa. Logo, um programa pode ser dividido em partes sequenciais nao concorrentes de sua execucao em threads distintas, conferindo paralelismo na execucao destas.Thread em JavaA maquina virtual Java permite que uma aplicacao tenha diversos fluxos rodando concorrentemente. Para isso a API Java disponibiliza a classe Thread e a interface Runnable.Classe ThreadUma classe pode estender da classe pai chamada "Thread". Essa implementacao exige a implementacao do metodo run(), que contem o codigo a ser executado pela thread em si.Ex:public class ExemploThread extends Thread { public void run() { int total = 0; while ((int)(Math.random()*100) != 50) total++; System.out.println("Sou a " + this.getName() + " e tentei " + total + " vezes."); }Para rodar a thread e so instanciar o objeto e chamar o metodo start():ExemploThread t = new ExemploThread();t.start();Esse por sinal e responsavel em chamar o metodo run.Interface RunnableA linguagem Java nao permite heranca multipla, logo, foi criada pela Sun uma alternativa para o uso de mais uma superclasse, que e a utilizacao de interfaces. Essa interface tem um funcionamento bem parecido com a classe Thread, ao exigir a implementacao do metodo Run(). Diferente de implementacoes que utilizam a classe Thread diretamente, as que utilizam a interface Runnable possuem algumas particularidades. Apos instanciar o objeto que possui a interface Runnable, e necessario instanciar tambem um objeto da classe Thread que receba em seu metodo construtor uma referencia ao objeto da interface Runnable, bem como um nome para a thread criada. Apos instanciar este objeto da classe Thread, pode-se iniciar a thread a partir do seu metodo start(). Ex:public class ExemploRunnable implements Runnable { public void run() { int total = 0; while ((int)(Math.random()*100) != 50) total++; }}public class Main { public static void main(String[] args) { ExemploRunnable r = new ExemploRunnable(); Thread t = new Thread(r, "Thread 1"); t.start(); }}Esta interface torna-se muito importante, pois em diversos momentos e necessario que uma classe tenha dois pais ao mesmo tempo. Um bom exemplo deste tipo de aplicacao e para interfaces graficas. Uma classe criada para fazer uma janela, por exemplo, pode ser filha da classe JPanel e, para possibilitar paralelismo e uma melhor experiencia para o usuario, pode implementar a classe Runnable.Ciclo de vida de uma ThreadUma thread, do momento em que e criada ate o qual e finalizada, passa por diversos estados e transicoes.Como mencionado anteriormente, as threads sao criadas a partir de sua instanciacao. Ao disparar o metodo start(), ela sera colocada na lista de threads prontas a serem executadas pelo sistema operacional. Quando o sistema operacional seleciona uma thread para ser executada, ela permanece no estado Execucao, produzindo as acoes do metodo run().Uma thread permanece em Execucao ate que: seu tempo de uso da CPU se esgote ou com a chamada do metodo yield() quando executa um sleep(), permanecendo no estado Suspenso durante o tempo estabelecido e voltando ao estado Pronto, em seguida; quando executa um wait(), permanecendo no estado Suspenso ate que outra thread execute um notify() ou notifyAll(), voltando ao estado