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 中文站