Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程赛车仿真问题_Java_Eclipse_Multithreading_Thread Sleep_Thread Synchronization - Fatal编程技术网

Java多线程赛车仿真问题

Java多线程赛车仿真问题,java,eclipse,multithreading,thread-sleep,thread-synchronization,Java,Eclipse,Multithreading,Thread Sleep,Thread Synchronization,我有一个代表赛车的类,在它里面我有一个方法,每当一辆车通过1000 int的检查点时,它就会打印到控制台 在run override中,我调用了该方法,它支持为我创建的每辆车运行不同的程序,但我认为我出错了,因为结果每次都会发生变化(它需要保持不变,因为有些车速度更快,所以我不认为这些车在不同的线程中移动) 嗯,这里: public RacingCar(String model, int speed){ this.start(); this.model = model;

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

在run override中,我调用了该方法,它支持为我创建的每辆车运行不同的程序,但我认为我出错了,因为结果每次都会发生变化(它需要保持不变,因为有些车速度更快,所以我不认为这些车在不同的线程中移动)

嗯,这里:

public RacingCar(String model, int speed){
    this.start();
    this.model = model;
    this.speed = speed;
}
在对象完全创建之前,您正在使用
this.start()
,这是不好的。 第二件事,在线程已经运行之后分配参数(意味着非确定性行为)


一般来说,您应该创建对象并在构造函数外部运行它。

您应该在循环中移动睡眠,并在开始线程之前完全创建赛车

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();
    }
}
公共类RacingCar扩展线程{
私有字符串模型;
私人整数速度;
公共赛车(字符串模型,整数速度){
this.model=模型;
速度=速度;
}
@凌驾
公开募捐{
试一试{
go();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
private void go()引发InterruptedException{
int trackLength=5000;
int=0;
对于(int i=0;i

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

也不能保证线程的执行顺序。您要做的是创建三个线程,让每个线程循环,直到打印前达到1000。然后,再睡10毫秒,然后退出。您可能打算在启动线程之前设置速度,以及在循环中休眠(但即使如此,您也无法严格保证打印行的顺序…)。虽然可能与原始问题无关,但您确定顺序:
start();这个模型=模型;速度=速度?动作后初始化?每个模拟对象使用一个线程严重限制了模拟的可伸缩性,并且可能使模拟更加复杂。如果您试图实时模拟某些内容(例如,在窗口中显示),那么您最好使用提交给
ScheduledThreadPoolExecutor
或某种GUI框架计时器的任务来执行对时间敏感的计算。请稍候,第二条语句是正确的,但这是关于什么的“您是在完全创建对象之前使用它的”?该对象现在已创建,因为所有超级构造函数和隐式初始化都已完成,它没有使用传入构造函数的参数进行完全初始化,但这可能是有意的(尽管是错误的)。一旦所有构造函数都完成,对象就被完全构造。否则行为是未定义的。您的意思是说他在对象完全构造之前调用
start
。那么我同意。但是在构造函数中使用
this
本身并不是问题,例如
this.model=model
不会导致任何错误定义的行为。这就是我的意思。哦,你是对的。那是在我脑子里,忘了键入:)你能把
try
放进
run
的主体中,让
run
方法在
InterruptedException
上返回吗?看到这样的代码很痛苦,即使它最初是这样的。我不想这样在中断时释放线程(在这个教育示例中,我不关心)--我只想向Arie Pinto传达循环的本质!:)我同意,这不是重点,但我想整个例子都会被采纳,不仅仅是循环。教坏习惯是一种好的做法吗?不,我不认为教坏行为是一种好的做法——但我确实相信尽可能多地忽略细节在培养基本直觉的同时,le是值得的。(在这种情况下,我不认为Arie会通过让赛车线程在中断情况下表现良好来更好地理解赛车循环的基本问题——因此我决定将该细节从主要逻辑中移开。)也就是说,示例总是可以改进的——所以我将实施您的建议。祝您有愉快的一天!
public RacingCar(String model, int speed){
    this.start();
    this.model = model;
    this.speed = speed;
}
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();
    }
}