Thread.sleep
является статическим методом в классе Thread
.
Причина, по которой вы можете вызвать sleep
напрямую без каких-либо определителей в анонимном классе, заключается в том, что вы на самом деле находитесь в контексте классачто наследуется от Thread
.Следовательно, sleep
доступен там.
Но в случае лямбды вы не принадлежите к классу, который наследует от Thread
.Вы находитесь внутри любого класса, окружающего этот код.Следовательно, sleep
не может быть вызван напрямую, и вам нужно сказать Thread.sleep
.Документация также поддерживает это:
Лямбда-выражения имеют лексическую область видимости.Это означает, что они не наследуют никаких имен от супертипа или вводят новый уровень видимости.Объявления в лямбда-выражении интерпретируются так же, как и во внешней среде.
По сути, это говорит о том, что внутри лямбды вы фактически находитесь в той же области видимости, как если бы вы были вне лямбда-выражения.Если вы не можете получить доступ к sleep
за пределами лямбды, вы также не можете получить доступ и к внутренней части.
Также обратите внимание, что два способа создания потока, которые вы здесь показали, по сути различны.В лямбда-1 вы передаете Runnable
конструктору Thread
, тогда как в анонимном первом классе вы создаете Thread
, непосредственно создавая его анонимный класс.