需求说明:
前方有 3km 的道路障碍,4 辆普通车不能通过,必须等到清障车完成作业离开后,才能继续行驶。用程序来模拟这一过程的发生
实现思路:
创建清障车Wrecker类和车辆OrdinaryVehicle类都需要继承Thread 类
在 Wrecker 类中,定义初始化线程名的参构造方法,重写run方法,run方法中模拟循环3次,打印输出清障车的清理进度,并调用 Thread 类的 sleep休眠1.5秒
在 OrdinaryVehicle 类中,声明一个 Wrecker 类型的引用变量 wrecker,同时声明初始化线程名和Wrecker对象的构造方法。重写run方法,调用 wrecker 的 join() 方法,等待 wrecker 线程执行完成。定义一个只循环 3 次的 for 循环,在循环体内打印输出普通车辆的行驶里程,并调用休眠方法0.5秒
创建 TestCase 类。在该类的 main() 方法中,分别创建一个 Wrecker 对象和 3 个 OrdinaryVehicle 对象,依次调用 Wrecker 对象和 OrdinaryVehicle 对象的 start() 方法,启动这 4 条线程
实现代码:
清障车Wrecker类
public class Wrecker extends Thread{ public Wrecker(String name) { this.setName(name); } @Override public void run() { super.run(); //每循环一次表示清理了1km障碍 for (int i = 1; i <=3 ; i++) { System.out.println("清理车已清理了前方"+i+"km 的障碍"); try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } } } }
车辆OrdinaryVehicle类
public class OrdinaryVehicle extends Thread{ private Wrecker wrecker; public OrdinaryVehicle(Wrecker wrecker, String name) { super(); this.wrecker = wrecker; this.setName(name); } @Override public void run() { super.run(); try { wrecker.join(); for (int i = 1; i <= 3; i++) { System.out.println("在"+wrecker.getName()+"清理完成障碍之后," +this.getName()+"行驶了"+i+"km"); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } }
TestCase 类
public class TestCase { public static void main(String[] args) { //创建清障车线程 Wrecker wrecker = new Wrecker("清障车"); //创建4条普通车辆线程 OrdinaryVehicle car_a = new OrdinaryVehicle(wrecker,"车辆A"); OrdinaryVehicle car_b = new OrdinaryVehicle(wrecker,"车辆B"); OrdinaryVehicle car_c = new OrdinaryVehicle(wrecker,"车辆C"); OrdinaryVehicle car_d = new OrdinaryVehicle(wrecker,"车辆D"); //先启动清障车线程,再依次启动4条普通车辆线程 wrecker.start(); car_a.start(); car_b.start(); car_c.start(); car_d.start(); } }