【问题标题】:java multithreading : traffic intersection systemjava多线程:交通路口系统
【发布时间】:2016-04-19 06:48:17
【问题描述】:

我试图通过有 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 米”相同的次数,但每次都是随机的?

【问题讨论】:

  • 应该打印相同的次数 为什么?尝试多次运行程序并比较结果。
  • 因为 car2 只等到 car1 越过
  • 你说'但每次都是随机的'。是的。每次都是随机的。欢迎来到多线程开发的世界。
  • 它的打印顺序是随机的,因为它们都同时运行,但它们应该都打印出相同的次数

标签: java multithreading


【解决方案1】:

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

你应该做的是使用条件来通知 car2 car1 调用了 incrementDistance() 并且 car2 应该在它的 race() 方法中等待这个条件。 这将确保 car2 打印预期的输出..

【讨论】:

    【解决方案2】:

    线程“car 1”是唯一增加距离并确定循环何时停止的线程。由于线程独立运行并以不同的速度运行,因此“car 2”打印的次数将无法预测。

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 2020-02-20
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      相关资源
      最近更新 更多