O JVM alterna a thread (segmento) em execução. Para uma classe se transformar em thread, é necessário implementar a interface Runnable
Classe Runnable
public class Conta implements Runnable {
private String nome;
Conta(String anome) {
nome = anome;
}
// o método run é definido na interface Runnable
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println(nome + ": " + i);
}
}
}
Exemplo de uso
Para usar essa classe em threads
Runnable conta1 = new Conta("Junior");
Runnable conta2 = new Conta("Flavio");
Thread t = new Thread(conta1);
Thread t2 = new Thread(conta2);
t.start();
t2.start();
Saída provável
Junior: 1
Flavio: 1
Junior: 2
Flavio: 2
Junior: 3
Flavio: 3
Flavio: 4
Flavio: 5
Flavio: 6
Flavio: 7
Flavio: 8
Flavio: 9
Flavio: 10
Junior: 4
Junior: 5
Junior: 6
Junior: 7
Junior: 8
Junior: 9
Junior: 10
Synchronized
Se ambas as threads chamarem um método perigoso é necessário fazer este método synchronized
Assim apenas um segmento (thread) vai poder acessar este método por vez.
É como se houvesse uma chave. A primeira thread que acessar o método vai trancar este método até que termine, uma vez terminada ela abre (destranca) o método para demais threads.
private synchronized void incrementa() {...}
Para sincronizar apenas parte do fonte, ao invés de todo o método use:
public void go() {
doSomething();
synchronized(this) { // esta linha é o segredo do gato
fazAlgoCriticoUnica();
}
}