legongju.com
我们一直在努力
2025-01-12 01:55 | 星期天

java怎么实现生产者消费者模型

在Java中,生产者消费者模型可以通过使用线程同步机制(如synchronized关键字、Lock接口、Semaphore信号量等)和wait()、notifyAll()等待通知机制实现。这里给出一个简单的示例,使用synchronized关键字和wait()、notifyAll()方法实现生产者消费者模型。

首先,创建一个共享资源类(共享队列):

import java.util.LinkedList;
import java.util.Queue;

public class SharedQueue {
    private Queue queue = new LinkedList<>();

    public synchronized void add(int item) {
        while (queue.size() == 10) {
            try {
                wait(); // 当前线程等待,释放锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        queue.add(item);
        notifyAll(); // 当前线程通知其他线程
    }

    public synchronized int remove() {
        while (queue.isEmpty()) {
            try {
                wait(); // 当前线程等待,释放锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        int item = queue.poll();
        notifyAll(); // 当前线程通知其他线程
        return item;
    }
}

接下来,创建生产者和消费者线程类:

public class Producer implements Runnable {
    private SharedQueue sharedQueue;

    public Producer(SharedQueue sharedQueue) {
        this.sharedQueue = sharedQueue;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            sharedQueue.add(i);
            System.out.println("生产者生产了: " + i);
            try {
                Thread.sleep(100); // 模拟生产耗时
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Consumer implements Runnable {
    private SharedQueue sharedQueue;

    public Consumer(SharedQueue sharedQueue) {
        this.sharedQueue = sharedQueue;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            int item = sharedQueue.remove();
            System.out.println("消费者消费了: " + item);
            try {
                Thread.sleep(200); // 模拟消费耗时
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

最后,在主类中创建生产者和消费者线程并启动:

public class Main {
    public static void main(String[] args) {
        SharedQueue sharedQueue = new SharedQueue();
        Producer producer = new Producer(sharedQueue);
        Consumer consumer = new Consumer(sharedQueue);

        Thread producerThread = new Thread(producer);
        Thread consumerThread = new Thread(consumer);

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

运行上述代码,可以看到生产者和消费者线程交替执行,生产者生产商品放入共享队列,消费者从共享队列取出商品。这样就实现了一个简单的生产者消费者模型。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/79926.html

相关推荐

  • java的框架是什么意思

    java的框架是什么意思

    Java框架是预先编写的、可重用的代码库,它提供了一种开发Java应用程序的标准化方法。这些框架通过提供一组API、组件和工具,简化了Web、移动、桌面和企业应用程...

  • java变量是什么意思

    java变量是什么意思

    在Java编程语言中,变量是用于存储数据值的标识符。它们可以存储不同类型的数据,如整数、浮点数、字符串等。变量的定义包括指定其类型和名称。变量的类型决定了...

  • java如何输出字符串数组

    java如何输出字符串数组

    在Java中,你可以使用Arrays.toString()方法将字符串数组转换为一个格式化的字符串,然后使用System.out.println()方法输出这个字符串。下面是一个示例:
    i...

  • java怎么打印输出九九乘法表

    java怎么打印输出九九乘法表

    在Java中,你可以使用嵌套循环来打印输出九九乘法表。以下是一个示例代码:
    public class MultiplicationTable { public static void main(String[] args) ...

  • java怎么打印整个数组

    java怎么打印整个数组

    在Java中,你可以使用Arrays.toString()方法来打印整个数组。这个方法会将数组转换成一个易于阅读的字符串格式。以下是一个示例:
    import java.util.Arrays...

  • java怎么定义一个byte数组

    java怎么定义一个byte数组

    在Java中,可以通过以下几种方法定义一个byte数组: 使用字面量创建byte数组: byte[] byteArray1 = {1, 2, 3, 4, 5}; 使用new关键字创建一个指定大小的byte数组...

  • java编译器是什么

    java编译器是什么

    Java编译器(Java Compiler)是一种用于将Java源代码转换为字节码(.class文件)的工具。它是由James Gosling和他的团队在Sun Microsystems公司开发的,现在属于...

  • java哪些类是线程安全的

    java哪些类是线程安全的

    Java中提供了许多线程安全的类,这些类主要位于java.util.concurrent包中。以下是一些常用的线程安全类: BlockingQueue:这是一个支持线程安全的队列,可以在并...