Java Threads щафета

Здравей те,
имам малко въпросче отностно следната програма:

import java.util.Random;

class Athlete extends Thread {

    private int num;

    public Athlete(int num) {
        this.num = num;
    }

    @Override
    public void run() {
        synchronized (RelaySim.relay) {

            try {
                RelaySim.relay.wait();
            } catch (InterruptedException ex) {
            }
            
            
            System.out.println("Starting " + this.num);

            try {
                Thread.sleep(((new Random()).nextInt(3) + 9) * 1000);
            } catch (InterruptedException ex) {
            }

            
            System.out.println("Finishing " + this.num);
            
            RelaySim.relay.notify();
        }
    }
}

public class RelaySim {

    public static final Object relay = new Object();

    public static void main(String[] args) {

        Athlete a[] = new Athlete[4];

        for (int i = 0; i < 4; i++) {
            a[i] = new Athlete(i);
            a[i].start();
            try {
                Thread.sleep(1);
            } catch (InterruptedException ex) {
            }
        }

        synchronized (relay) {
            relay.notify();
        }
    }
}

Това е малка симулация на щафета. Целта е да се създадът 4 атлета който да бягат от 9 до 11 секунди да подадът щафетата на следващия атлет и така докато минат всички.
Атлетите трябва да са последователни първия на втория, втория на трения и т.н.
Единстеното решение за "последователността" което имам е Thread.sleep(1); след всеки старт на всяка нишка. Но не мисля че това решение като цяло е правилно. Ако някой може да ми предложи нещо по-подходящо ще съм много благодарен.

трябва да стане через синхронизиран блок и
public static final Object relay = new Object();

Иначе щях да пусна първия, първия втория и т.н.
Идеята е за се ползва синхронизиран блок , wait и notify.
Но този sleep хич не ми харесва там, но ако го няма освен че не са подредени се получава и deathlock