Quando lanci una classe java la java virtual machine fa partire un thread (un filo d'esecuzione) che esegue il metodo main della classe lanciata; creando altri thread crei piu fili d'esecuzione indipendenti che avanzano contemporaneamente nello stesso spazio di memoria, potendo quindi scambiarsi messaggi e condividere variabili ed è la jvm ad alternare i vari thread nel possesso della cpu.