public class Exemplo extends Thread
{
private static int contador = 1;
private static int numero_threads = 0;
private int id_thread;
public Exemplo()
{
id_thread = GetID();
}
public synchronized int GetID()
{
numero_threads++;
return numero_threads;
}
public void run()
{
try
{
executa();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void executa()throws InterruptedException
{
if(id_thread == contador)
{
/*
Executa as instruções da thread corrente
*/
contador++;
}
else
{
Thread.sleep(500);//coloca a thread corrente para dormir;
}
if(id_thread == numero_threads)
contador = 1; //reinicia o contador
}
}
Bem acho que isso explica tudo.
Cada objeto da classe Exemplo vai ter um id diferente.
Sera comparado com o contador, será ou não executado,
assim você vai ter controle das threads.
Exemplo ex1 = new Exemplo();
Esse objeto vai ter o id = 1, entao ele só vai ser executado quando o contador for igual a 1 no metodo executa.
Exemplo ex1 = new Exemplo();
Exemplo ex2 = new Exemplo();
Exemplo ex3 = new Exemplo();
Se existissem tres threads seus ids seriam respectivamente 1 , 2 e 3.
e só seriam executados nessa ordem.
Quando voce declara um metodo como synchronized,
apenas uma thread por vez poderá entrar no método.
Quando voce declara um atributo como static,
todos os objetos da classe vão ler e escrever em uma mesma
area de memoria em se tratando desse atributo, ou seja, se
um objeto setar o valor do atributo para 10 , todos os outros objetos
vão ver 10 como valor do atributo e vice-versa.
Qualquer dúvida, eu tento explicar novamente.