账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    多线程生产者与消费者模型?
    • 2019-07-07 00:00
    • 11
    56
    0

    多线程生产者与消费者模型

    生产者与消费者模型,通过Object的wait()以及notifyAll()方法实现以及同步方法实现

    相关代码

    // 请把代码文本粘贴到下方(请勿用图片代替代码)

    
    class Resource {
        private int num = 0;
        private boolean flag = true;
        // flag为true可以执行加法操作,不可以执行减法操作
        // flag为false可以执行减法操作,不可以执行加法操作
        public synchronized void add() throws Exception {
           if(!this.flag) { // flag为false只能执行减法操作
               super.wait(); // 需要等待
           }
           //Thread.sleep(100);
            this.num++;
            System.out.println(Thread.currentThread().getName() + "运行, num = " + this.num);
            this.flag = false; // 可以进行减法操作
            super.notifyAll(); // 唤醒其他线程
        }
        public synchronized void sub() throws Exception {
            if(this.flag) { // flag为true只能进行加法操作,减法操作需要等待
                super.wait();
            }
           // Thread.sleep(100);
            this.num--;
            System.out.println(Thread.currentThread().getName() + "运行, num = " + this.num);
            this.flag = true    ; // 可以进行加法操作
            super.notifyAll(); // 唤醒其他线程
        }
    }
    
    class AddThread implements Runnable {
        private Resource res;
    
        public AddThread(Resource res) {
            this.res = res;
        }
        @Override
        public void run() {
            for (int i = 0 ; i < 50 ; i++) {
                try {
                    this.res.add();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    class SubThread implements Runnable {
        private Resource res;
    
        public SubThread(Resource res) {
            this.res = res;
        }
    
        @Override
        public void run() {
            for (int i = 0 ; i < 50 ; i++) {
                try {
                    this.res.sub();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public class ThreadDemo {
        public static void main(String[] args) {
            Resource res = new Resource();
            AddThread at = new AddThread(res);
            SubThread st = new SubThread(res);
    
            new Thread(at, "加法操作-1").start();
            new Thread(at, "加法操作-2").start();
    
            new Thread(st, "减法操作-1").start();
            new Thread(st, "减法操作-2").start();
        }
    }

    我期待他加完只能减,减完只能加.而现在输出的不对,他会小于0

    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 多线程生产者与消费者模型是一种常见的多线程编程模型,主要用于处理并消费大量的数据。这种模型的主要思想是将任务分解为多个线程进行处理,每个线程负责处理一部分数据,然后将处理结果推送给消费者。

      以下是多线程生产者与消费者模型的基本步骤:

      1. 创建生产者线程:生产者线程负责从数据库或其他数据源中获取数据,并将其转化为需要的格式。生产者线程需要保证数据的实时性,因此需要使用线程池或其他线程调度工具。

      2. 创建消费者线程:消费者线程负责接收生产者线程传来的数据,并将其转化为需要的格式。消费者线程需要保证数据的实时性,因此需要使用线程池或其他线程调度工具。

      3. 消费者线程接收生产者线程传来的数据:生产者线程会在适当的时间发送数据给消费者线程。

      4. 消费者线程处理数据:消费者线程需要对处理后的数据进行适当的处理,例如格式化、分析等。

      5. 消费者线程将处理后的数据推送给消费者:消费者线程将处理后的数据推送给其他消费者,或者将处理后的数据保存到数据库或其他数据源中。

      6. 线程池或其他线程调度工具负责线程的调度:线程池或其他线程调度工具负责选择合适的线程进行任务的执行,确保任务的执行效率和线程的效率。

      以上就是多线程生产者与消费者模型的基本步骤。这种模型可以处理大量的数据,但是需要保证线程的执行效率和线程的并发性。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部