Isso já foi mencionado, mas só para ficar claro: criar um novo objeto Thread apenas para chamar seu método run () é desnecessariamente caro e deve ser um grande sinal de alerta. Seria um design muito melhor e mais desacoplado criar um Runnable impl e (a) chamar seu método run () diretamente se esse for o comportamento desejado, ou (b) construir um novo Thread com esse Runnable e iniciar o Thread.
Melhor ainda, para ainda mais desacoplamento, verifique a Executor
interface e a estrutura no JDK 5 e mais recente. Isso permite a você, em poucas palavras, desacoplar a execução da tarefa (a instância Runnable) de como ela é executada (a implementação do Executor, que pode executar o Runnable no Thread atual, em um novo Thread, usando um Thread existente de um pool, e o que não).