用Java线程(正在上大学)

问题描述 投票:0回答:1

[创建一个模拟运动场训练的程序,体育场内只有一条跑道,一次最多可使用5人并且教练不允许超过该数字,但是当某些运动员完成跑步时(2秒)并释放空间,然后通知其他运动员跑步。

2秒后,所有进程都被冻结

我的问题是,任何人都可以向我解释为什么这样的事情不起作用以及如何处理此问题吗?

class JoggingTrack {
    public int numOfAthlete;

    public JoggingTrack() {
        this.numOfAthlete = 0;
    }

    @Override
    public String toString() {
        return "\nNumber of Athlete: " + numOfAthlete + "\n";
    }
}

class Athlete extends Thread {

    private JoggingTrack track;
    private boolean running;

    public Athlete(JoggingTrack s) {
        this.track = s;
        this.running = false;
    }

    public synchronized boolean thereIsSpace() {
        if(track.numOfAthlete < 5) {
            return true;
        }
        return false;
    }

    public synchronized void addAthlete() {
        track.numOfAthlete++;
        this.running = true;
    }

    public synchronized void removeAthlete() {
        track.numOfAthlete--;
        this.running = false;
    }

    @Override
    public void run() {
        try {
            while(true) {
                while(!this.thereIsSpace()) {
                    wait();
                }
                while(!this.running) {
                    addAthlete();
                    sleep(2000);
                } 
                while(this.running) {
                    removeAthlete();
                    notify();
                }
            }
        } catch (Exception e) {
        }
    }

}

public class Program {
    static JoggingTrack track;
    static Athlete[] a;

    public static void main(String[] args) {
        track = new JoggingTrack();
        a = new Athlete[10];
        for(int i = 0; i < 10; i++) {
            a[i] = new Athlete(track);
            a[i].start();
        }
        while(true) {
            try {
                System.out.println(track);
                Thread.sleep(500);
            } catch (Exception e) {
            }
        }
    }
}
java multithreading wait notify
1个回答
0
投票

与此相关的许多问题。

© www.soinside.com 2019 - 2024. All rights reserved.