有stu1、stu2和tea,3个线程,其中stu1准备睡10分钟后再开始上课,stu2准备睡1小时后再开始上课。tea在输出3句“上课”后吵醒休眠的线程stu1;stu1被吵醒后,负责吵醒休眠的线程stu2。用JAVA编写
时间: 2024-05-07 21:16:54 浏览: 100
以下是使用Java代码实现该问题的解决方案:
```java
public class ThreadExample {
public static void main(String[] args) {
Object lock = new Object();
Thread stu1 = new Thread(() -> {
try {
System.out.println("stu1开始休眠10分钟");
Thread.sleep(600000); // 休眠10分钟
System.out.println("stu1休眠结束");
synchronized (lock) {
lock.notify(); // 唤醒线程
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread stu2 = new Thread(() -> {
try {
System.out.println("stu2开始休眠1小时");
Thread.sleep(3600000); // 休眠1小时
System.out.println("stu2休眠结束");
synchronized (lock) {
lock.notify(); // 唤醒线程
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread tea = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("tea开始输出上课");
for (int i = 0; i < 3; i++) {
System.out.println("上课");
Thread.sleep(1000); // 休眠1秒
}
lock.wait(); // 等待唤醒
System.out.println("tea被stu1唤醒");
lock.notify(); // 唤醒stu2
lock.wait(); // 等待唤醒
System.out.println("tea被stu2唤醒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
stu1.start();
stu2.start();
tea.start();
}
}
```
在上述代码中,我们首先定义了一个Object类型的锁并将其用于线程间的同步通信。然后创建了3个线程,分别是stu1、stu2和tea,并在线程中实现了对应的业务逻辑。在主线程中,我们启动了这3个线程。
在tea线程中,我们先输出了3次“上课”,然后进入同步代码块并调用锁对象的wait()方法,释放锁并等待被其它线程唤醒。stu1线程中,在休眠10分钟后,调用锁对象的notify()方法,唤醒睡眠中的线程等待队列中的线程,即tea线程。当tea线程被唤醒后,它会继续执行wait()方法后面的部分,然后再次进入同步代码块并调用notify()方法,唤醒stu2线程。stu2线程被唤醒后,将继续执行其中的业务逻辑。
这样就实现了一个简单的多线程同步通信的例子。
阅读全文