zoukankan      html  css  js  c++  java
  • Java线程——线程之间的通信

    Java中多线程间的通信是怎么实现的?

    线程通信的方式:

    (1)共享变量

      线程之间的通信可以通过发送信号,发送信号的一个简单方法就是再共享的对象里面设置信号值。线程A在一个同步块中设置boolean型的成员变量hasDataToProcess为true,线程B在同步块中读取hasDataProcess的值,如下:

    package com.itheima.threadTest;
    
    public class ThreadtTest {
        //共享的变量
        private boolean hasDataToProcess=false;
        //取值
        public boolean getHasDataToProcess() {
            return hasDataToProcess;
        }
        //设值
        public void setHasDataToProcess(boolean hasDataToProcess) {
            this.hasDataToProcess = hasDataToProcess;
        }
            
        public static void main(String[] args) {
            //创建一个对象
            final ThreadtTest my=new ThreadtTest();
            //线程1设置hasDataToProcess的值为true
            final Thread t1=new Thread(new Runnable() {
                @Override
                public void run() {
                    my.setHasDataToProcess(true);
                    
                }
            });
            
            //线程1开始执行
            t1.start();
            
            //线程2取值
            Thread t2=new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //等待线程1执行完
                        t1.join();
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                    
                    my.getHasDataToProcess();
                    
                    System.out.println("t1改变后的值:"+my.getHasDataToProcess());
                }
            });
            t2.start();
        }

    (2)wait/notify机制

      生成者消费者案例

    package com.itheima.threadTest;
    
    //资源类
    class Resource{
        private String name;
        private int count=1;
        //标志位
        private boolean flag=false;  //当标识位为false时是生产者执行,为true是消费者执行
        
        //生成资源
        public synchronized void set(String name) {
            //根据标志位判断是否到自己执行了
            while(flag) {
                //标志位为true时,生产者等待,消费者执行
                try {
                    //注意如果是同步代码块的话,就要使用锁住的那个对象来调用wait()
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
            //如果到自己执行了
            this.name=name+"---"+count++;
            System.out.println(Thread.currentThread().getName()+"....生产者......."+this.name);
            
            //修改标识位
            flag=true;
            //唤醒其他等待的线程
            this.notifyAll();
        }
        
        //消费资源
        public synchronized void out() {
            //判断标识位
            while(!flag) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
            System.out.println(Thread.currentThread().getName()+".....消费者......."+this.name);
            
            flag=false;
            this.notifyAll();
        }
            
    }
    
    //生产者线程
    class Producer implements Runnable{
        private Resource res;
        Producer(Resource res){
            this.res=res;
        }
        //生成者生成资源
        @Override
        public void run() {
            for(int i=0;i<5;i++){
                res.set("商品!");
            }
            
        }    
    }
    
    //消费者消费资源
    class Consumer implements Runnable{
        private Resource resource;
        public Consumer(Resource resource) {
            this.resource=resource;
        }
        @Override
        public void run() {
            for(int i=0;i<5;i++) {
                resource.out();
            }
            
        }
    }
    
    public class ProducerConsumerDemo {
        public static void main(String[] args) {
            //参加一个公共资源
            Resource r=new Resource();
            
            //两个线程
            Producer producer=new Producer(r);
            Consumer consumer=new Consumer(r);
            Thread t1=new Thread(producer);
            Thread t2=new Thread(consumer);
            
            t1.start();
            t2.start();
        }
    }

      运行结果:

         

  • 相关阅读:
    城市承灾体脆弱性和易损性的影响因素
    《风暴潮、海浪、海啸和海冰灾害应急预案》
    承灾体
    ArcGIS数据存储的方式
    ArcGIS几种数据格式2
    ArcGIS几种数据格式
    【ArcGIS】文件地理数据库,个人地理数据库与ArcSDE的局别
    dojo事件绑定
    Spark最简安装
    Spark 概述
  • 原文地址:https://www.cnblogs.com/zhilili/p/11984757.html
Copyright © 2011-2022 走看看