编写一个Java 应用程序,在主线程中创建 了个线程,即“运货司机”“装运 工〞和“仓库管理员”,要求“运货司机”线程占有 CPU 资源后立刻联合“装运工”线程,也就是让 ‘运货司机”一直等到“装运工”完成工作才能开车,而“装运工”占有 CPU 资源后立刻联合“仓库管理员“线程,也就是让“装运工〞一直等到“仓库管理员”打开仓库才能开始搬运货物。
时间: 2023-09-16 12:14:24 浏览: 62
代码如下:
```java
public class MultiThreadDemo {
public static void main(String[] args) {
// 创建运货司机线程
DriverThread driverThread = new DriverThread();
// 创建装运工线程
LoaderThread loaderThread = new LoaderThread(driverThread);
// 创建仓库管理员线程
WarehouseManagerThread warehouseManagerThread = new WarehouseManagerThread(loaderThread);
// 启动三个线程
warehouseManagerThread.start();
loaderThread.start();
driverThread.start();
}
}
class DriverThread extends Thread {
@Override
public void run() {
System.out.println("运货司机到达仓库");
synchronized (this) {
try {
System.out.println("等待装运工完成工作...");
wait(); // 等待装运工完成工作
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("开始运货");
}
}
class LoaderThread extends Thread {
private Thread driverThread;
public LoaderThread(Thread driverThread) {
this.driverThread = driverThread;
}
@Override
public void run() {
System.out.println("装运工到达仓库");
synchronized (this) {
try {
System.out.println("等待仓库管理员打开仓库...");
wait(); // 等待仓库管理员打开仓库
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("开始装运货物");
synchronized (driverThread) {
driverThread.notify(); // 通知运货司机线程可以开始运货
}
}
}
class WarehouseManagerThread extends Thread {
private Thread loaderThread;
public WarehouseManagerThread(Thread loaderThread) {
this.loaderThread = loaderThread;
}
@Override
public void run() {
System.out.println("仓库管理员到达仓库");
try {
Thread.sleep(2000); // 模拟仓库管理员开仓库的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("仓库管理员打开仓库");
synchronized (loaderThread) {
loaderThread.notify(); // 通知装运工线程可以开始装运货物
}
}
}
```
输出结果为:
```
仓库管理员到达仓库
装运工到达仓库
等待仓库管理员打开仓库...
运货司机到达仓库
等待装运工完成工作...
仓库管理员打开仓库
开始装运货物
开始运货
```
阅读全文