• 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();
                }
            }
        }
  • 相关阅读:
    并行 并发 概念
    为什么C++编译器不能支持对模板的分离式编译_刘未鹏
    并发编程的15 条建议
    VS2005 C++ str.Format 编译错误
    PPT 去除排练计时
    VS2005中 depends.exe 在哪里
    《A wavelet tour of signal processing》前言摘录
    Windows Forms 2.0 Programming 读书笔记Hello, Windows Forms
    VS2005 宽字符 unicode字符集和多字节字符集
    Windows Forms 2.0 Programming 读书笔记Hello, Windows Forms(2)
  • 原文地址:https://www.cnblogs.com/bimingcong/p/10365192.html
Copyright © 2020-2023  润新知