class SharedResource {
private int data = 0;
private boolean available = false;
// 生产者线程调用此方法
public synchronized void produce(int value) throws InterruptedException {
while (available) {
wait(); // 如果资源已可用,则等待,释放锁并进入等待状态
}
data = value;
available = true;
notify(); // 唤醒一个等待的消费者线程
}
// 消费者线程调用此方法
public synchronized int consume() throws InterruptedException {
while (!available) {
wait(); // 如果资源不可用,则等待,释放锁并进入等待状态
}
available = false;
notify(); // 唤醒一个等待的生产者线程
return data;
}
}
public class ProducerConsumerExample {
public static void main(String[] args) {
SharedResource resource = new SharedResource();
// 生产者线程
Thread producer = new Thread(() -> {
for (int i = 0; i < 5; i++) {
try {
System.out.println("Producing: " + i);
resource.produce(i);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
// 消费者线程
Thread consumer = new Thread(() -> {
for (int i = 0; i < 5; i++) {
try {
System.out.println("Consuming: " + resource.consume());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
producer.start();
consumer.start();
}
}
SharedResource 类:
data
:存储共享的数据。available
:标记数据是否可用。produce(int value)
:生产者调用此方法来生产数据。如果数据已经存在(available
为true
),则生产者线程会调用wait()
进入等待状态,直到消费者消费了数据并调用notify()
唤醒它。consume()
:消费者调用此方法来消费数据。如果数据不可用(available
为false
),则消费者线程会调用wait()
进入等待状态,直到生产者生产了数据并调用notify()
唤醒它。ProducerConsumerExample 类:
SharedResource
对象,用于在生产者和消费者之间共享数据。synchronized
关键字确保同一时间只有一个线程可以访问共享资源,从而避免竞态条件。wait() 和 notify() 方法:
wait()
:使当前线程等待,直到其他线程调用notify()
或notifyAll()
方法唤醒它。调用wait()
时,线程会释放锁,并进入等待状态。notify()
:唤醒一个正在等待该对象监视器的线程。如果有多个线程在等待,则由JVM选择其中一个线程进行唤醒。上一篇:java 实体转json
下一篇:java 获取ip地址
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站