public class RaceTest
{
    public RaceTest()
    {
    }
    public static void main(String[] args)
    {
        try
        {
            Player p1=new Player("乌龟", 1);
            Player p2=new Player("兔子", 5);
            p1.forReady();
            p2.forReady();
            Thread.currentThread().sleep(100);
            synchronized(start_signal)
            {
                start=true;
                start_signal.notifyAll();
            }
            p1.join();
            p2.join();
        }
        catch(Throwable e)
        {        }
    }
    private static Object start_signal = new Object();
    private static volatile boolean start = false;
    private static volatile boolean stop = false;
    private static final int total_distance = 100;
    private static class Player extends Thread
    {
        int speed;
        int distance = 0;
        Player(String name,int _speed)
        {
            this.setName(name);
            speed = _speed;
        }
        private volatile boolean ready = false;
        public void run()
        {
            long time=0;
            try
            {
                //Ready 信号
                synchronized(this)
                {
                    ready=true;
                    this.notify();
                }                //比赛开始
                synchronized(start_signal)
                {
                    if (!start)
                        start_signal.wait();
                }
                long t0 = System.currentTimeMillis();
                while(!stop && distance < total_distance)
                {
                    distance += speed;
                    sleep(100);
                }
                stop = true;
                long t1 = System.currentTimeMillis();
                time = t1-t0;
            }
            catch(InterruptedException e)
            {            }
            System.out.println(getName() + " 速度:" + speed + "  距离:" + distance + " 时间:" + time + "毫秒");
        }
        public synchronized void forReady()
        {
            this.start();
            try
            {
                while(!ready)
                {
                    this.wait();
                }
            }
            catch(Throwable e)
            {
                e.printStackTrace();
            }
        }
    }
}