java多线程: traffic intersection system

标签 java multithreading

我试图通过2个线程在java中使用多线程,其中一个线程代表一辆汽车以单向行驶通过十字路口,另一个线程代表另一辆汽车等待通过十字路口。我的问题是 car2 打印“car2 is waiting to cross”的次数比应有的次数多(它应该只打印 6 次)。我尝试过使用同步,但不起作用。这是一个非常简单的程序,我试图制作它来帮助自己理解多线程,如下所示。

public class Drive {
    public static Thread car1;
    public static Thread car2;

    public static void main(String[]args){

        Cars cars = new Cars();

        car1 = new Thread(cars, "car 1");
        car2 = new Thread(cars, "car 2");

        car1.start();
        car2.start();

    }
}
<小时/>
public class Cars implements Runnable{

    int distance = 0;

    public void increaseDistance(){
        distance ++;
    }

    public void race(){
        while(distance <= 5){

            if(Thread.currentThread().getName().equals("car 1")){               
                System.out.println("Distance covered by " + Thread.currentThread().getName() + " is " + distance + " meters");
                increaseDistance(); 
            }

            if(Thread.currentThread().getName().equals("car 2")){

                System.out.println(Thread.currentThread().getName() + " is waiting to cross");
            }

        }

    }   

    public void run(){
        race();
    }
}
<小时/>

输出低于...

car 2 is waiting to cross
car 2 is waiting to cross
car 2 is waiting to cross
car 2 is waiting to cross
car 2 is waiting to cross
Distance covered by car 1 is 0 meters
car 2 is waiting to cross
Distance covered by car 1 is 1 meters
Distance covered by car 1 is 2 meters
Distance covered by car 1 is 3 meters
Distance covered by car 1 is 4 meters
Distance covered by car 1 is 5 meters
car 2 is waiting to cross

哪里说“汽车 2 正在等待过马路”,应该打印出与“汽车 1 行驶的距离是 x 米”相同的次数,但每次都是随机的?

最佳答案

调用car1的incrementDistance()方法后,car2的race()方法不必只执行一次。该方法有可能被多次调用。欢迎来到不规则的日程安排世界。

您应该做的是使用条件通知 car2 car1 已调用incrementDistance(),并且 car2 应在其 race() 方法中等待此条件。 这将确保 car2 打印预期的输出..

关于java多线程: traffic intersection system,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36710555/

相关文章:

java - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure

java - 使用 toObject 方法将 Snapshot 转换为 POJO 时,将包含 Date 对象的代码转换为 Firebase.Timestamp 对象的最佳方法

java - 如何使我的 ArrayList 线程安全? Java中解决问题的另一种方法?

java - 终止应用程序和 ScheduledExecutorService;线

linux - 确定线程的执行时间和不同线程的IO访问

尝试使用 ReetrantLock(true) 锁定/解锁时 Java 线程锁

Java线程notify()方法

Java Swing - 按下的键未释放(有时)

java - 案例类对象上的 Scala groupBy

java - 在codeigniter中修改时编辑下拉列表