Ca revient exactement au même. Quand tu fait un extends Thread, tu redéfini la méthode run(). Quand tu fais un implements Runnable, tu defini la méthode run() de la même manière, puis tu fais un new Thread(tonRunnable), et après ça s'utilise exactement de la même manière, puisque la méthode run() de Thread appelle la méthode run() du Runnable passé en argument au constructeur.