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();
            }
        }
    }
原文地址:https://www.cnblogs.com/bimingcong/p/10365192.html