Thread
необычна тем, что для запуска может потребоваться ссылка на Runnable
, но сама она также Runnable
. По умолчанию Thread
будет использовать себя как экземпляр Runnable
для запуска, хотя, конечно, вы можете указать его где-нибудь еще.
Я думаю, что нет веской причины либо отмечать Thread
final и требовать внешнего Runnable
, либо делать Thread
расширяемым и иметь собственный Runnable
. Оба подхода прекрасно подходят, и ни один из них не выглядит намного лучшим выбором, чем другой.
Если бы мне пришлось угадывать, причина создания подкласса Thread
заключается в том, что он позволяет писать код, подобный этому:
Thread t = new Thread() {
public void run() {
/* ... your code here ... */
}
};
Что немного чище, чем создание подкласса Runnable
, а затем завернуть его в поток. Точно так же вы можете подкласс от Thread
, чтобы получить Runnable
, который ясно указывает, что он должен использоваться в качестве потока. Конечно, это в основном вопрос эстетики, и если бы Java-дизайнеры пошли другим путем, я думаю, это было бы идеальным решением.