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();
                }
            }
        }
  • 相关阅读:
    IPC之——消息队列
    特殊命令
    面试概念集锦
    守护进程(精灵进程)
    IP SSL HTTPS
    钉钉监控样例
    中间人攻击
    iptables firewalld
    简单暴力高效率的OSM全球地图
    解决ubuntu使用命令sudo apt -get install 安装东西时出现"E: Sub-process /usr/bin/dpkg returned an error code (1) "的错误 问题描述:
  • 原文地址:https://www.cnblogs.com/bimingcong/p/10365192.html
Copyright © 2011-2022 走看看