notify、notifyall、wait在object的,不在thread的原因
时间: 2023-06-25 19:08:03 浏览: 105
`notify()`, `notifyAll()`, 和 `wait()` 方法不在 `Thread` 类中,而是在 `Object` 类中,因为它们是用于线程间通信的机制,而不是用于线程本身的控制。这些方法被设计成在共享对象上调用,以允许线程之间进行协同工作和同步。任何对象都可以用作锁,线程可以在锁上进行等待,等待其他线程释放锁并通知等待线程继续执行。因此,这些方法必须在 `Object` 类中实现,以便所有对象都可以使用它们来进行线程间通信。而 `Thread` 类只是表示一个线程的抽象实体,它提供了控制线程状态和执行的方法,但不涉及线程间通信的机制。
相关问题
关于sleep()和wait(),以下描述错误的一项是(D) A、sleep是线程类(Thread)的方法,wait是Object类的方法; B、Sleep不释放对象锁,wait放弃对象锁; C、Sleep暂停线程、但监控差太仍然保持,结束后会自动恢复; D、Wait后进入待待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状
关于 sleep() 和 wait(),错误的描述是 D、Wait 后进入等待锁定池,只有针对此对象发出 notify() 方法后才能获得对象锁进入运行状态。
解析:
sleep() 和 wait() 都是 Java 中用于线程等待的方法,但它们的作用和实现方式有所不同:
- sleep() 方法是线程类(Thread)的方法,它让当前线程暂停一段时间,让出 CPU 的时间片,但不会释放对象锁。线程在调用 sleep() 方法后,会进入阻塞状态,等待指定的时间后自动恢复运行。
- wait() 方法是 Object 类的方法,它让当前线程暂停,并释放对象锁,直到其他线程调用该对象的 notify() 或 notifyAll() 方法才能继续运行。线程在调用 wait() 方法后,会进入等待状态,直到其他线程调用 notify() 或 notifyAll() 方法后才能重新获得对象锁进入运行状态。
因此,选项 A 和 B 描述都是正确的。选项 C 描述了 sleep() 方法的作用和实现方式,也是正确的。选项 D 描述的是错误的,wait() 方法不会进入等待锁定池,而是进入等待状态,等待其他线程调用 notify() 或 notifyAll() 方法后才能重新获得对象锁进入运行状态。
java怎么使用wait(), notify(), notifyAll()来实现三个线程轮流执行的效果
可以通过以下代码实现三个线程轮流执行的效果:
```java
public class ThreeThread {
private int count = 0;
private final Object lock = new Object();
public static void main(String[] args) {
ThreeThread threeThread = new ThreeThread();
Thread threadA = new Thread(() -> threeThread.print("A", 0));
Thread threadB = new Thread(() -> threeThread.print("B", 1));
Thread threadC = new Thread(() -> threeThread.print("C", 2));
threadA.start();
threadB.start();
threadC.start();
}
private void print(String name, int flag) {
synchronized (lock) {
while (count % 3 != flag) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(name);
count++;
lock.notifyAll();
}
}
}
```
其中,count 用于记录当前轮到哪个线程执行,lock 是用来实现多线程同步的对象。在每个线程的执行体中,使用 synchronized (lock) 来加锁保证线程间的互斥。在 while 循环中判断当前轮到哪个线程执行,如果不是当前线程轮到,则使用 lock.wait() 阻塞当前线程。在轮到当前线程执行后,执行相应的操作(例如输出线程名),然后将 count 加一,再使用 lock.notifyAll() 通知所有在等待的线程重新进行判断。这样就可以循环执行三个线程。
阅读全文