Это потому, что вы вызываете метод «move» с фиксированной скоростью, определенной задержкой первого «start»
Thread.sleep(star.delay);
Так что, если вы перемещаете их немного каждые "n" миллисекунд, они, похоже, будут двигаться в том же покое.
Если вы хотите, чтобы они двигались с разной скоростью, вы должны перемещать их в другой ветке (сейчас вы используете только одну). Запомните комментарий: omry,
EDIT
Я сделал нечто подобное совсем недавно
У меня есть две разные вещи, которые так оживляют, поэтому у меня есть два таймера (таймеры используют потоки внизу, но они могут повторять код выполнения каждую фиксированную скорость).
Первый применяет текст к JLabel каждую секунду (1000 мс)
final Timer timer = new Timer();
timer.scheduleAtFixedRate( new TimerTask() {
public void run(){
setText();
}
}, 0, 1000 );
И другие меняют отображаемое изображение каждые 10 секунд (10000 мс)
final Timer imageTimer = new Timer();
imageTimer.scheduleAtFixedRate( new TimerTask() {
public void run() {
setImage();
}
}, 0, 10000 );
Здесь у меня есть видео результата:
Для более продвинутого (и приятного) управления временем вы ДОЛЖНЫ взглянуть на проект "Timing Framework" , который добавляет дополнительные возможности для таймеров.