生产者/消费者问题

对于经典的操作系统中的生产者/消费者问题,用Java语言编程实现。

问题:在一个共享空间可存储n个数,

生产者1随机产生一个奇数,打印并放入共享空间;生产者2随机产生一个偶数,打印并放入共享空间;

消费者1从共享空间中取出奇数,打印所有取出奇教的总和;消费者2从共享空间中取出偶数,打印所有取出偶数的总和。

思路:
1.共享存储空间未满,生产者可进行存数据;存储满,wait()等待(放弃lock),阻塞,等待notifyAll()唤醒。

2.共享存储空间不空(有数据),可读取数据;若空,则消费者wait()等待(放弃lock),阻塞,等待notifyAll()唤醒。

 

package org.example;

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

public class ProducerConsumerExample {
    private static final int maxSize = 10;

    public static void main(String[] args) {
        Queue<Integer> sharedQueue = new LinkedList<>();

        //lock同步锁   实现进程同步
        Object lock = new Object();

        long start = System.currentTimeMillis();
        Thread producer1 = new Producer(sharedQueue, maxSize, lock, true,start);
        Thread producer2 = new Producer(sharedQueue, maxSize, lock, false,start);
        Thread consumer1 = new Consumer(sharedQueue, lock, true,start);
        Thread consumer2 = new Consumer(sharedQueue, lock, false,start);

        producer1.start();
        producer2.start();
        consumer1.start();
        consumer2.start();

    }

    static class Producer extends Thread {
        private final Queue<Integer> queue;
        private final int maxSize;
        private final Object lock;
        private final boolean isOddProducer;
        private final long start;

        public Producer(Queue<Integer> queue, int maxSize, Object lock, boolean isOddProducer,long start) {
            this.queue = queue;
            this.maxSize = maxSize;
            this.lock = lock;
            this.isOddProducer = isOddProducer;
            this.start = start;
        }

        @Override
        public void run() {
            while (System.currentTimeMillis()-start< time.overTime) {
                //同步代码块
                synchronized (lock) {
                    while (queue.size() == maxSize) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    Random random = new Random();
                    int number = random.nextInt(100);
                    if ((isOddProducer && number % 2 != 0) || (!isOddProducer && number % 2 == 0)) {
                        queue.add(number);
                        System.out.println("生产者" + (isOddProducer ? "1" : "2") + " 生产: " + number);
                        lock.notifyAll();
                    }
                }
            }
        }
    }

    static class Consumer extends Thread {
        private final Queue<Integer> queue;
        private final Object lock;
        private final boolean isOddConsumer;
        private int sum = 0;
        private final long start;

        public Consumer(Queue<Integer> queue, Object lock, boolean isOddConsumer,long start) {
            this.queue = queue;
            this.lock = lock;
            this.isOddConsumer = isOddConsumer;
            this.start = start;
        }

        @Override
        public void run() {
            while (System.currentTimeMillis()-start< time.overTime) {
                synchronized (lock) {
                    while (queue.isEmpty()) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                    int number = queue.peek(); //获取队列头部元素

                    if ((isOddConsumer && number % 2 != 0) || (!isOddConsumer && number % 2 == 0)) {
                        queue.poll(); //移除队列的头部元素
                        sum += number;
                        System.out.println("消费者" + (isOddConsumer ? "1" : "2") + " 消费: " + number +"   "+ (isOddConsumer ? "当前奇数" : "当前偶数")+" 总和: " + sum);
                        lock.notifyAll();
                    }
                }
            }
        }
    }

  
    public static class time {
        private static long overTime = 50;
    }
}

运行截图:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python模拟生产者/消费者问题是一种常见的多线程问题生产者线程负责生成数据并将其放入共享队列中,而消费者线程则负责从队列中取出数据并进行处理。这种设计模式可以有效地解决生产者消费者之间的数据同步和互斥问题。 使用Python可以通过线程和队列模块来实现生产者/消费者模式。线程模块可以创建和管理线程,队列模块可以提供线程安全的队列数据结构。 具体实现可以按照以下步骤进行: 1. 导入所需的模块,包括线程和队列模块。 2. 创建一个共享队列,用于生产者消费者之间的数据传递。 3. 定义一个生产者函数,该函数在一个循环中生成数据并将其放入队列中。 4. 定义一个消费者函数,该函数在一个循环中从队列中取出数据并进行处理。 5. 创建生产者线程和消费者线程,并启动它们。 6. 等待线程结束。 以下是一个示例代码来模拟生产者/消费者问题: ```python import threading import queue # 创建共享队列 queue = queue.Queue() # 定义生产者函数 def producer(): while True: data = generate_data() # 生成数据 queue.put(data) # 将数据放入队列中 # 定义消费者函数 def consumer(): while True: data = queue.get() # 从队列中取出数据 process_data(data) # 处理数据 # 创建生产者线程和消费者线程 producer_thread = threading.Thread(target=producer) consumer_thread = threading.Thread(target=consumer) # 启动线程 producer_thread.start() consumer_thread.start() # 等待线程结束 producer_thread.join() consumer_thread.join() ``` 以上代码中,生产者函数(producer)在一个循环中生成数据并将其放入队列中,消费者函数(consumer)在一个循环中从队列中取出数据并进行处理。生产者线程和消费者线程分别启动后,可以并行执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值