zoukankan      html  css  js  c++  java
  • Java多线程消费者、生产者的基本思路

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

     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();
                }
            }
        }
  • 相关阅读:
    浅谈MyBatis-Plus学习之条件构造器 EntityWrapper
    浅谈MyBatis-Plus学习之插件扩展
    [XSS防御]HttpOnly之四两拨千斤
    [PHP防火墙]输入内容存在危险字符,安全起见,已被本站拦截
    [思路笔记]WEB安全之漏洞挖掘
    通过TleChat插件一键Getshell
    云服务器上安装MSF环境
    (vshadow)Volume Shadow在渗透测试中的利用
    一个帖子csrf的例子
    yuyuecms 1.2文件删除漏洞
  • 原文地址:https://www.cnblogs.com/bimingcong/p/10365192.html
Copyright © 2011-2022 走看看