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();
                }
            }
        }
  • 相关阅读:
    php5.5+apache2.4+mysql5.7在windows下的配置
    rsync命令详解
    JVM GC算法 CMS 详解(转)
    JVM1.6 GC详解
    hadoop2升级的那点事情(详解)
    免费SVN空间
    JAVA正则表达式:Pattern类与Matcher类详解(转)
    Eclipse插件安装方式及使用说明
    可扩展Web架构与分布式系统(转)
    关于《Selenium3自动化测试实战--基于python语言》
  • 原文地址:https://www.cnblogs.com/bimingcong/p/10365192.html
Copyright © 2011-2022 走看看