首页常见问题正文

用wait-notify写一段代码来解决生产者-消费者问题?

更新时间:2023-08-16 来源:黑马程序员 浏览量:

IT培训班

  生产者-消费者问题是一个经典的并发编程问题,涉及到多个线程共享资源的同步与互斥。使用Java的wait和notify机制可以有效地解决这个问题。

  接下来笔者就用具体的Java代码实现的简单生产者-消费者问题解决方案:

import java.util.LinkedList;

class SharedResource {
    private LinkedList<Integer> buffer = new LinkedList<>();
    private int capacity = 5;

    public synchronized void produce() throws InterruptedException {
        while (buffer.size() == capacity) {
            wait(); // 等待,直到缓冲区不满
        }

        int item = (int) (Math.random() * 100);
        buffer.add(item);
        System.out.println("Produced: " + item);

        notifyAll(); // 唤醒等待的消费者线程
    }

    public synchronized void consume() throws InterruptedException {
        while (buffer.size() == 0) {
            wait(); // 等待,直到缓冲区不空
        }

        int item = buffer.removeFirst();
        System.out.println("Consumed: " + item);

        notifyAll(); // 唤醒等待的生产者线程
    }
}

class Producer implements Runnable {
    private SharedResource sharedResource;

    public Producer(SharedResource sharedResource) {
        this.sharedResource = sharedResource;
    }

    @Override
    public void run() {
        try {
            while (true) {
                sharedResource.produce();
                Thread.sleep(1000); // 模拟生产时间
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class Consumer implements Runnable {
    private SharedResource sharedResource;

    public Consumer(SharedResource sharedResource) {
        this.sharedResource = sharedResource;
    }

    @Override
    public void run() {
        try {
            while (true) {
                sharedResource.consume();
                Thread.sleep(1500); // 模拟消费时间
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class Main {
    public static void main(String[] args) {
        SharedResource sharedResource = new SharedResource();

        Thread producerThread = new Thread(new Producer(sharedResource));
        Thread consumerThread = new Thread(new Consumer(sharedResource));

        producerThread.start();
        consumerThread.start();
    }
}

  在这个例子中,SharedResource类表示共享的缓冲区,其中的produce和consume方法分别用于生产和消费数据。Producer和Consumer类分别表示生产者和消费者线程,它们通过调用SharedResource的方法来生产和消费数据。使用wait和notifyAll方法来实现线程之间的同步与互斥,确保在正确的时机唤醒等待的线程。

  需要注意的是,这只是一个简单的示例,实际生产环境中可能需要更复杂的逻辑和错误处理。同时,Java 5及之后的版本提供了更高级的并发工具,如BlockingQueue和ExecutorService,可以更方便地解决生产者-消费者问题。

分享到:
在线咨询 我要报名
和我们在线交谈!