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了,生产者消费者 都加锁了 而且是同一把锁

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

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

                            

  • 相关阅读:
    上机小笔记
    机器人搬重物(BFS)
    排序汇总
    棋盘(BFS)
    权限控制:分配权限1
    asp.net identity 基础概念篇-理解什么是声明
    EntityFramework中几种更改数据的方式
    CodeFirst迁移时出现的中文乱码问题
    javascript Function()
    C#操作数据库(二)【操作SQL Server数据库的常用的类介绍】
  • 原文地址:https://www.cnblogs.com/toov5/p/9837373.html
Copyright © 2011-2022 走看看