Это ключевое слово final в параметре не имеет ничего общего с тем, что вы наблюдаете.
Что в действительности происходит здесь: вы создаете один объект потока, который является экземпляром анонимного внутреннего sub класса Thread. И этот экземпляр получает URL-0 в качестве параметра. Затем после этого вы вызываете метод run()
этого одного объекта Thread 4 раза. Таким образом, один и тот же объект печатает одну и ту же строку 4 раза.
Чтобы быть более точным:
- при первом вводе
fun()
статическое поле thread
равно нулю
- поэтому создается новый экземпляр, и входящая строка копируется в контекст этого (подкласса Thread) объекта. Эта строка "url-0"
- затем вы вызываете run () для этого объекта 4 раза
И, как указано в комментариях: простой вызов run()
для объекта потока не приводит к тому, что реальный поток ОС работает параллельно. Вы должны позвонить start()
вместо этого. Но, конечно, абсолютно бессмысленно повторно вызывать start()
для одного и того же потока.
Итак, чтобы ваш код делал больше, чем вы ожидаете, попробуйте следующее:
public class Demo {
public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
fun("url-" + i);
}
}
public static void fun(String url) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(url);
}
});
thread.start();
}
}