zoukankan      html  css  js  c++  java
  • 多线程之间的通讯

    多线程之间如何实现通讯

    什么是多线程之间通讯?

       多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。

       画图演示

    多线程之间通讯需求

      需求:第一个线程写入(input)用户,另一个线程取读取(out)用户.实现读一个,写一个操作。

    代码实现基本实现

       下面我们看个例子    生产者 消费者

    package com.toov5.thread;
    
    //共享对象
    class Res{
        public String sex;
        public String name;
        
    }
    
    class inputThread extends Thread{
         public Res res;
         public inputThread(Res res) {
            this.res=res;
        }
        @Override
        public void run() {
          int count=0; 
          while (true) {
            if (count==0) {
                res.name="lucy";
                res.sex="girl";    
            }else {
                res.name="Jack";
                res.sex="boy";
            }
            count =(count+1)%2;
        }
        }
    }
    
    class readThread extends Thread{
        public Res res;
        public readThread(Res res) {
            this.res=res;
        }
        
        @Override
        public void run() {
            
            while (true) {
                System.out.println(res.name+","+res.sex);
            }
            
        }
    }
    
    public class ConmunicatThreadTest {
        //开启两个线程  下面的线程 主线程 还有这俩用户线程 cpu随机的
    
        public static void main(String[] args) {
            Res res = new Res();
        inputThread inputThread = new inputThread(res);
        readThread  readThread = new readThread(res);
        inputThread.start();
        readThread.start();
        
        }  
           
        
    }

    结果

    有问题的了

    需要解决线程问题,每个线程的本地内存没有及时刷新到主内存中去

    好合理使用synchronize关键字哟

    package com.toov5.thread;
    
    //共享对象
    class Res{
        public String sex;
        public String name;
        
    }
    
    class inputThread extends Thread{
         public Res res;
         public inputThread(Res res) {
            this.res=res;
        }
        @Override
        public  void run() {
          int count=0; 
          while (true) {
              synchronized (res) {
                    if (count==0) {
                        res.name="lucy";
                        res.sex="girl";    
                    }else {
                        res.name="Jack";
                        res.sex="boy";
                    }
                    count =(count+1)%2;
            }
        }
        }
    }
    
    class readThread extends Thread{
        public Res res;
        public readThread(Res res) {
            this.res=res;
        }
        
        @Override
        public void run() {
            while (true) {
            synchronized (res) {
                    System.out.println(res.name+","+res.sex);
                }
            }        
        }
    }
    
    public class ConmunicatThreadTest {
        //开启两个线程  下面的线程 主线程 还有这俩用户线程 cpu随机的
    
        public static void main(String[] args) {
            Res res = new Res();
        inputThread inputThread = new inputThread(res);
        readThread  readThread = new readThread(res);
        inputThread.start();
        readThread.start();
        
        }  
           
        
    }

    读的时候不能写 写的时候不能读 上锁啦~~

     结果

     

     这下OK了,生产者消费者 都加锁了 而且是同一把锁

    在写的时候 读的线程不能进进行读

    在读的时候,写的线程不能进行写

                            

  • 相关阅读:
    Kafka原理与java simple producer示例
    【转载】kafka的工作原理
    Python 基本类型转换
    hadooop2.6 job pending research
    记一次zookeeper集群搭建错误的排除
    Apache Drill Install and Test
    Linux或Unix环境利用符号链接升级Maven
    Android之Linearlayouy线性布局
    Effective Java Second Edition --- Builder Pattern
    java生产者/消费者模式实现——一生产者一消费者(操作值)
  • 原文地址:https://www.cnblogs.com/toov5/p/9837373.html
Copyright © 2011-2022 走看看