Java多线程消费者、生产者的基本思路

Wesley13
• 阅读 369

多线程主要考察的就是 线程的同步控制   生产者消费者的思路就是,当 一个线程执行时让另一个线程 挂起就行了

ThreadOne、ThreadTwo同时运行,添加一个变量在一个公共类(下边的Function类)中,

例如:当变量为true,ThreadOne执行ThreadTwo挂起;

当变量为false,ThreadOne挂起ThreadTwo执行

一个线程执行完之后,自己重置变量(目的是把自己挂起),然后唤醒另一个挂起的线程,如此便可使两个线程交替执行

对于消费者、生产者来说:

当消费者拿不到东西的时候就把自己挂起,并且唤醒生产者就可以了

当生产者生产完东西的时候就把自己挂起,并且唤醒消费者就可以了

//这是一个共享的类,主线程和子线程共用
    class Function{
        private boolean flag=false;
        //子线程要实现的功能
        public synchronized void sub(){
            while(flag){  //此处用while循环而不是用if语句判断是为了防止 线程的假唤醒
                try {
                    this.wait(); //此处的this指的是当前执行此段代码的线程
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            for(int i=0;i<10;i++){
                //for循环内定义子线程的功能,这里简单的假设为打印一句话,主线程同理
                System.out.println("sub"+i);
            }

            flag=true;
            this.notify();
        }
        //主线程要实现的功能
        public synchronized void main(){
            while(!flag){ //此处用while循环是为了 防止线程的假唤醒
                try {
                    this.wait(); //此处this指的是当前执行此段代码的线程
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for(int i=0;i<10;i++){
                System.out.println("main"+i);
            }

            flag=false;
            this.notify();
        }

    }

    public class Demo01 {

        public static void main(String[] args) {
            final Function f=new Function();
            new Thread(
                    new Runnable(){

                        @Override
                        public void run() {
                            for(int i=0;i<50;i++){
                                f.sub();
                            }
                        }

                    }
            ).start();

            for(int i=0;i<50;i++){
                f.main();
            }
        }
    }
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
九章 九章
3年前
一 java线程的等待/通知模型
java中线程之间的通信问题,有这么一个模型:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。前者是生产者,后者就是消费者,也可以叫做生产者消费者问题生产者生产了产品,如何通知消费者?下面就介绍下java线程中的等待通知机制。其它语言类似,自行研究。代码附上下面是以买小
Wesley13 Wesley13
2年前
Java多线程与并发之ThreadLocal原理解析
1\.ThreadLocal是什么?使用场景ThreadLocal简介ThreadLocal是线程本地变量,可以为多线程的并发问题提供一种解决方式,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
Java多线程与并发之ThreadLocal
1\.ThreadLocal是什么?使用场景ThreadLocal简介ThreadLocal是线程本地变量,可以为多线程的并发问题提供一种解决方式,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Qt中的QThread:使用QSemaphore进行多线程数据同步
20210127:在生产者、消费者的方法中添加线程挂起方法QThread::usleep(10),使ui不卡。20210128:在添加Track类(保存生产者Producer生成的每组数据),在ui界面中使用modelview同步显示生产者生成的数据,modelview不会对主线程造成卡顿。对消费者同样创建view,还没有进行model绑定。避免
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这