首頁(yè)常見問題正文

用wait-notify寫一段代碼來解決生產(chǎn)者-消費(fèi)者問題?

更新時(shí)間:2023-08-16 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  生產(chǎn)者-消費(fèi)者問題是一個(gè)經(jīng)典的并發(fā)編程問題,涉及到多個(gè)線程共享資源的同步與互斥。使用Java的wait和notify機(jī)制可以有效地解決這個(gè)問題。

  接下來筆者就用具體的Java代碼實(shí)現(xiàn)的簡(jiǎn)單生產(chǎn)者-消費(fèi)者問題解決方案:

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(); // 等待,直到緩沖區(qū)不滿
        }

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

        notifyAll(); // 喚醒等待的消費(fèi)者線程
    }

    public synchronized void consume() throws InterruptedException {
        while (buffer.size() == 0) {
            wait(); // 等待,直到緩沖區(qū)不空
        }

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

        notifyAll(); // 喚醒等待的生產(chǎn)者線程
    }
}

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); // 模擬生產(chǎn)時(shí)間
            }
        } 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); // 模擬消費(fèi)時(shí)間
            }
        } 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();
    }
}

  在這個(gè)例子中,SharedResource類表示共享的緩沖區(qū),其中的produce和consume方法分別用于生產(chǎn)和消費(fèi)數(shù)據(jù)。Producer和Consumer類分別表示生產(chǎn)者和消費(fèi)者線程,它們通過調(diào)用SharedResource的方法來生產(chǎn)和消費(fèi)數(shù)據(jù)。使用wait和notifyAll方法來實(shí)現(xiàn)線程之間的同步與互斥,確保在正確的時(shí)機(jī)喚醒等待的線程。

  需要注意的是,這只是一個(gè)簡(jiǎn)單的示例,實(shí)際生產(chǎn)環(huán)境中可能需要更復(fù)雜的邏輯和錯(cuò)誤處理。同時(shí),Java 5及之后的版本提供了更高級(jí)的并發(fā)工具,如BlockingQueue和ExecutorService,可以更方便地解決生產(chǎn)者-消費(fèi)者問題。

分享到:

Java培訓(xùn)班課程javaee

Python培訓(xùn)機(jī)構(gòu)python大數(shù)據(jù)

web前端培訓(xùn)課程升級(jí)V8.5web

AI+設(shè)計(jì)培訓(xùn)課程ui

大數(shù)據(jù)培訓(xùn)課程cloud

軟件測(cè)試培訓(xùn)課程test

c

新媒體運(yùn)營(yíng)培訓(xùn)netmarket

產(chǎn)品經(jīng)理培訓(xùn)課程pm

linux培訓(xùn)Linux

movies

智能機(jī)器人培訓(xùn)robot

電商視覺設(shè)計(jì)課程uids

AI

集成電路應(yīng)用開發(fā)(嵌入式)培訓(xùn)課程jdbc

在線咨詢 我要報(bào)名
和我們?cè)诰€交談!