Java多线程赛车模拟问题

标签 java eclipse multithreading thread-sleep thread-synchronization

我有一个代表赛车的类,在它的内部我有一个方法,每当汽车通过 1000 int 检查点时就会打印到控制台。

在运行覆盖中,我调用该方法,它应该为我创建的每辆车以不同的方式运行,但我认为我出错了,因为结果每次都会改变(它需要保持不变,因为有些车更快,所以我不认为汽车在不同的线程中移动)。

public class RacingCar extends Thread{
private String model;
private int speed;
public RacingCar(){}
public RacingCar(String model, int speed){
    this.start();
    this.model = model;
    this.speed = speed;
}
public void go(){
    int trackLength=5000;
    int checkPointPassed=0;
    for(int i=0;i<trackLength;i+=speed){
        if(checkPointPassed*1000<i){
            checkPointPassed++;
            System.out.println(this.model+" has passed the "+checkPointPassed+"th check point");
        }
    }
}
@Override
public void run() {
    go();
    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}}

测试人员(主要):

public class Tester {
public static void main(String[] args) {
    new RacingCar("Honda", 6);
    new RacingCar("Lamborghini", 100);
    new RacingCar("McLaren", 8);
}}

最佳答案

您应该在循环内移动 sleep ,并在启动线程之前完全创建 RacingCar。

public class RacingCar extends Thread {
    private String model;
    private int speed;

    public RacingCar(String model, int speed) {
        this.model = model;
        this.speed = speed;
    }

    @Override
    public void run() {
        try {
            go();
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void go() throws InterruptedException {
        int trackLength = 5000;
        int checkPointPassed = 0;
        for(int i = 0; i < trackLength; i += speed) {
            if(checkPointPassed * 1000 < i) {
                checkPointPassed++;
                System.out.println(this.model + " has passed the " + checkPointPassed + "th check point");
            }
            Thread.sleep(10);
        }
    }
}

public class Tester {
    public static void main(String[] args) {
        RacingCar honda = new RacingCar("Honda", 6);
        RacingCar lamborghini = new RacingCar("Lamborghini", 100);
        RacingCar mcLaren = new RacingCar("McLaren", 8);

        honda.start();
        lamborghini.start();
        mcLaren.start();
    }
}

(请注意,即使您这样做,也无法严格保证线程的运行顺序。)

关于Java多线程赛车模拟问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33334991/

相关文章:

java - 如何在java中打印图像

java - 为什么 jstack out 说线程状态是 "RUNNABLE"而 socketRead

java - 找不到 ID 0x7f070053 的 View

java - Maven编译失败但没有java错误

java - Spring Maven 项目中的 Jasmine 测试 :expect jQuery UI autocomplete is not recognized in the spec

java - 使 Eclipse 在其控制台中显示最顶层的异常而不是完整的堆栈跟踪

java - 应用程序在服务启动时崩溃

java - 如何按顺序优雅地停止java线程?

python - 从Python脚本中的多个UDP套接字监听

java - 所有线程结束后打印数据