• 进程调度的数据共享问题-生产者消费者问题


    进程调度
    参考博客地址:https://blog.csdn.net/qq_33591903/article/details/83619172
    1.计算机通常只有一个CPU, 在任意时刻只能执行一条机器指令,每个线程只有获得CPU的使用权才能执行指令。
    2.并发执行:从宏观上看,各个线路轮流获得CPU的使用权。
    3.进程调度是指按照特定的机制为多个线程分配CPU的使用权
    4. 分时调度模型:让所有线程轮流获得CPU的使用权,并且平均分配每个线程占用CPU的时间片。
    5 . 抢占式调度模型:优先让可运行池中优先级高的线程较多可能占用CPU(概率高),如果可运行池中线程的优先级相同,那么就随机选择一个线程,使其占用CPU。处于可运行状态的线程会一直运行,直至它不得不放弃CPU。
    6.放弃CPU:
                . Java虚拟机让当前线程暂时放弃CPU,转到就绪状态;
                . 当前线程因为某些原因而进入阻塞状态;
                . 线程运行结束;
     7.数据共享:生产者消费者问题
    生产者和消费者同时使用一块缓冲区,生产者生产商品放入缓冲区,消费者从缓冲区中取出商品。我们需要保证的是,当缓冲区满时,生产者不可生产商品;当缓冲区为空时,消费者不可取出商品。
    wait()与notify()方法

    这两个方法是object类中的方法
    wait()用在以下场合:

    (1)当缓冲区满时,缓冲区调用wait()方法,使得生产者释放锁,当前线程阻塞,其他线程可以获得锁。

    (2)当缓冲区空时,缓冲区调用wait()方法,使得消费者释放锁,当前线程阻塞,其他线程可以获得锁。
    notify()用在以下场合:

    (1)当缓冲区未满时,生产者生产商品放入缓冲区,然后缓冲区调用notify()方法,通知上一个因wait()方法释放锁的线程现在可以去获得锁了,同步块代码执行完成后,释放对象锁,此处的对象锁,锁住的是缓冲区。

    (2)当缓冲区不为空时,消费者从缓冲区中取出商品,然后缓冲区调用notify()方法,通知上一个因wait()方法释放锁的线程现在可以去获得锁了,同步块代码执行完成后,释放对象锁。

      锁对象.wait();// 会释放锁资源 放弃cup执行权限
      this.notify();//随机唤醒一个线程-->等待池
      this.notifyAll();//唤醒所有线程
    public class ProAndCon {
        //最大容量
        public static final int MAX_SIZE = 2;
        //存储媒介
        public static LinkedList<Integer> list = new LinkedList<>();
     
        class Producer implements Runnable {
            @Override
            public void run() {
                synchronized (list) {
                    //仓库容量已经达到最大值
                    while (list.size() == MAX_SIZE) {
                        System.out.println("仓库已满,生产者" + Thread.currentThread().getName() + "不可生产.");
                        try {
                            list.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    list.add(1);
                    System.out.println("生产者" + Thread.currentThread().getName() + "生产, 仓库容量为" + list.size());
                    list.notify();
                }
            }
        }
     
        class Consumer implements Runnable {
     
            @Override
            public void run() {
                synchronized (list) {
                    while (list.size() == 0) {
                        System.out.println("仓库为空,消费者" + Thread.currentThread().getName() + "不可消费.");
                        try {
                            list.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    list.removeFirst();
                    System.out.println("消费者" + Thread.currentThread().getName() + "消费,仓库容量为" + list.size());
                    list.notify();
                }
            }
        }
     
     
        public static void main(String[] args) {
            ProAndCon proAndCon = new ProAndCon();
            Producer producer = proAndCon.new Producer();
            Consumer consumer = proAndCon.new Consumer();
     
            for (int i = 0; i < 10; i++) {
                Thread pro = new Thread(producer);
                pro.start();
                Thread con = new Thread(consumer);
                con.start();
            }
        }
     
    }
     


     

  • 相关阅读:
    【iOS】打印方法名
    【iOS】设备系统版本
    【iOS】receiver type *** for instance message is a forward declaration
    【iOS】获取应用程序本地路径
    hash算法
    redis文档
    Couchbase
    nodejs多核处理
    基于nodejs的消息中心
    nodejs两个例子
  • 原文地址:https://www.cnblogs.com/yxj808/p/11988022.html
Copyright © 2020-2023  润新知