Faça um Contador e um Monitor. Crie threads para cada um deles de forma que operem continuamente. O monitor deve monitorar o contador e deve resetá-lo tão logo enquanto observe que a contagem excedeu um valor limite. Descreva o que você observou e explique.
Modifique as duas classes para que o método run() faça um delay a cada iteração (use Thread.sleep(...)).
Crie contadores que contem até certo valor e terminem sua operação. O valor e o delay entre cada contagem (em segundos) devem ser determinado na construção do objeto. Experimente o método join().