Описаний підхід має один недолік. Оскільки в Java множинне спадкування відсутнє, вимога успадковуватися від Thread може привести до конфлікту. Якщо ще раз подивитися на наведений вище приклад, стане зрозуміло, що спадкування вироблялося тільки з метою перевизначення методу run(). Тому пропонується більше простий спосіб створити свій потік виконання. Досить реалізувати інтерфейс Runnable, у якому оголошений тільки один метод - уже знайомий void run(). Запишемо приклад, наведений вище, за допомогою цього інтерфейсу:
public class MyRunnable implements Runnable { public void run() { // деяка довга дія, обчислення long sum=0; for (int i=0; i<1000; i++) { sum+=i; } System.out.println(sum); }} Також незначно міняється процедура запуску потоку:
Runnable r = new MyRunnable();Thread t = new Thread(r);t.start(); Якщо раніше об'єкт, що представляє сам потік виконання, і об'єкт із методом run(), що реалізує необхідну функціональність, були об'єднані в одному екземплярі класу MyThread, то тепер вони розділені. Який із двох підходів удобней, вирішується в кожному конкретному випадку.
Підкреслимо, що Runnable не є повною заміною класу Thread, оскільки створення й запуск самого потоку виконання можливо тільки через метод Thread.start().