精华内容
下载资源
问答
  • 线程之间相互通信

    千次阅读 2018-08-22 19:48:00
    线程之间相互通信  在介绍线程相互通信前为大家介绍一下有关线程通信的一些知识    线程的状态(线程的生命周期)  线程的状态 NEW 新建状态,刚刚创建完成还没开启的状态 RUNNABLE 可运行状态,...

    线程之间的相互通信

                      在介绍线程相互通信前为大家介绍一下有关线程通信的一些知识

     

            线程的状态(线程的生命周期)       

    线程的状态
    NEW新建状态,刚刚创建完成还没开启的状态
    RUNNABLE可运行状态,有资格执行,可能在执行中,有可能不是在执行中
    BLOCKED锁阻塞状态,要等待其他线程释放锁对象
    WAITING无限等待,一个线程等待另一个线程执行一个(唤醒)动作
    TIMED_WAITING计时等待,这一状态一直保持到超过规定的时间,或者收到唤醒动作
    TERMINATED死亡状态,任务执行完毕的状态

          

         

                 有关线程通信的方法介绍

                                      以下方法都来自与object类,因为object是所有类的父类所以每一个类都可以使用以下方法

    void   wait()等待,让出cpu进入等待状态(如果一个线程内调用了该方法,那么该线程就停止运行,等待其他线程唤醒,或者其他线程调用notifAll方法)
    void  notify()唤醒,随机唤醒一个正在等待的线程,让其进入可运行状态(解除了调用wait方法线程的等待状态,让其变成可运行状态)
    void  notifyAll()唤醒所以进入等待状态的线程,让其都进入可运行状态

               

                 线程等待与唤醒的概述

                                线程的等待与唤醒又称为线程之间的通信,等待与唤醒机制是实现两个或多个线程在执行任务过程相互配合相互协作的一种技术。

                   

                线程之间相互通信带来的好处

                      先看看下面的代码运行结果(下面代码没有使用到线程通信的技术)          

    
    public class Dome01 {
        public static void main(String[] args) {
            //创建资源对象
            Person person = new Person();
            //创建两哥线程       传入Runnable的实现类  并且把资源对象传入构造方法
            Thread thread1 = new Thread(new ConsumerThread(person));
            Thread thread2 = new Thread(new ProductThread(person));
            //开启线程
            thread1.start();
            thread2.start();
        }
    }
    
    //创建消费对象Runnable的实现类   作用用来消费person里面的数据  就是把person里面的name和打印到控制台
    class ConsumerThread implements Runnable {
        //创建资源对象
        Person person;
        //有参构造  因为消费者和生产者要使用一个资源对象,所以创建构造方法传入资源对象
        public ConsumerThread(Person p) {
            person = p;
        }
        @Override
        public void run() {
            //创建一个变量,使每一次生产的数据都不一样
            boolean b = true;
            while (true) {
            //因为两个线程使用的是同一个资源对象 所以可以使用这个资源对象作为锁对象
            synchronized (person) {
                    //使用判断生产不同数据
                    if (b){
                        person.name = "如花";
                        person.age = 18;
                        //修改变量值使他下一次循环进入else
                        b = false;
                    } else {
                        person.name = "凤姐";
                        person.age = 100;
                        //修改变量值使他下一次循环进入else
                        b = true;
                    }
                }
            }
        }
    }
    
    //创建生产者对象Runnable的实现类  生产数据就是给person的name和age赋值
    class ProductThread implements Runnable {
        //创建资源对象
        Person person;
        //有参构造  因为消费者和生产者要使用一个资源对象,所以创建构造方法传入资源对象
        public ProductThread(Person p) {
            person = p;
        }
        @Override
        public void run() {
            //死循环消费数据
            while (true) {
            //因为两个线程使用的是同一个资源对象 所以可以使用这个资源对象作为锁对象
            synchronized (person) {
                    //判断生产者是否已经生产了数据,如果生产了数据就打印
                    if (person.name != null && person.age != 0) {
                        System.out.println(person.name + " " + person.age);
                    }
                }
            }
        }
    }
    
    //资源对象  让一个线程去给他赋值一个线程去消费数据,就是使用另一个线程给他赋的值
    class Person {
        String name;
        int age;
    }

            

             程序结果运行如下

                        程序输出的要么全部是  ” 如花  18 “   要么全部是  “凤姐  100” ,如果我们现在的条件是要  ” 如花  18 “ , “凤姐  100”

    要交替输出,我们如果不使用线程之间的相互通信是没办法做到的,因为不利用线程的相互通信技术我们没办法让线程和线程之间产生关系,也就是我们没办法通知另一条线程,说我输出完了让你赋值。

                   

                 下面是使用线程通信技术完成两行交替输出            

    
    public class Dome01 {
        public static void main(String[] args) {
            //创建资源对象
            Person person = new Person();
            //创建两哥线程       传入Runnable的实现类  并且把资源对象传入构造方法
            Thread thread1 = new Thread(new ConsumerThread(person));
            Thread thread2 = new Thread(new ProductThread(person));
            //开启线程
            thread1.start();
            thread2.start();
        }
    }
    
    //创建消费对象Runnable的实现类   作用用来消费person里面的数据  就是把person里面的name和打印到控制台
    class ConsumerThread implements Runnable {
        //创建资源对象
        Person person;
        //有参构造  因为消费者和生产者要使用一个资源对象,所以创建构造方法传入资源对象
        public ConsumerThread(Person p) {
            person = p;
        }
        @Override
        public void run() {
            //创建一个变量,使每一次生产的数据都不一样
            boolean b = true;
            while (true) {
            //因为两个线程使用的是同一个资源对象 所以可以使用这个资源对象作为锁对象
            synchronized (person) {
                    //使用判断生产不同数据
                    if (b){
                        person.name = "如花";
                        person.age = 18;
                        //修改变量值使他下一次循环进入else
                        b = false;
                    } else {
                        person.name = "凤姐";
                        person.age = 100;
                        //修改变量值使他下一次循环进入else
                        b = true;
                    }
                try {
                        //唤醒全部线程
                        person.notifyAll();
                        //调用该方法线程进入无限等待状态 ,并且释放锁对象  等待其他线程唤醒
                        person.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            }
        }
    }
    
    //创建生产者对象Runnable的实现类  生产数据就是给person的name和age赋值
    class ProductThread implements Runnable {
        //创建资源对象
        Person person;
        //有参构造  因为消费者和生产者要使用一个资源对象,所以创建构造方法传入资源对象
        public ProductThread(Person p) {
            person = p;
        }
        @Override
        public void run() {
            //死循环消费数据
            while (true) {
            //因为两个线程使用的是同一个资源对象 所以可以使用这个资源对象作为锁对象
            synchronized (person) {
                    //判断生产者是否已经生产了数据,如果生产了数据就打印
                    if (person.name != null && person.age != 0) {
                        System.out.println(person.name + " " + person.age);
                        try {
                            //等该方法打印完另一个线程所赋的值, 就唤醒全部线程
                            person.notifyAll();
                            //然后调用wait方法进入无限等待状态,并且释放锁
                            person.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }else{
                        try {
                            //如果进入了else里面说明 person对象还没有赋值,所以就调用wait方法让线程进入无限等待状态,把zpu资源让给其他线程
                            person.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    
    //资源对象  让一个线程去给他赋值一个线程去消费数据,就是使用另一个线程给他赋的值
    class Person {
        String name;
        int age;
    }

           

               程序运行结果

                 使用线程通信技术我们就可以让线程之间存在一定的关系,而不是每一个线程读是独立运行的,与其他线程无关。

                 使用wait,notify,notifyAll方法注意事项

                                这些方法必须是锁对象调用

                                必须在同步代码块,或者是同步方法和cock和unlcok方法中间调用。

     

     

    展开全文
  • 对象之间通信

    千次阅读 2011-10-11 17:20:55
    C++ 发消息,内存文件映射,socket等方式 对象有其特有的私有空间,又可以跟其它对象通信。 Java程序就是建立一个个对象(类)...下面考虑对象之间通信问题。   1、单向通信  对象b调用对象a,但是对象a
    C++ 发消息,内存文件映射,socket等方式
    

    对象有其特有的私有空间,又可以跟其它对象通信。
    Java程序就是建立一个个对象(类),然后由对象以及它们之间的通信来组织程序。
    下面考虑对象之间的通信问题。
     
    1、单向通信
       对象b调用对象a,但是对象a不调用对象b,则通常有一下方法:
    (1)在对象b中实例化一个类a。
       public class ClassA -->建立单向关联关系
        {...}                       // ClassA
       public class ClassB          // ClassB
       {
          // data
           ClassB classA;
          ...
        }   // End of ClassB
     
    (2)类方法或类变量 ----->建立依赖关系
         public class ClassA        // ClassA
         {
            // method
           public static void method1()
            {...}
          }   // End of ClassA                   
       
       public class ClassB         // ClassB
        {
          // method
          oublic void method2
          {
           ...
           ClassA.method1();
          }
        }   // End of ClassB
     
    2、双向通信
     (1)通过接口实现。
        具体就不介绍了。上一篇学习笔记有例子。
     (2)通过双向关系    

     
    3、通过超类来实现
    本质上其实跟接口是一样的。
     
    总之,要想双方实现双向通信,其实本质上都是一种:在其中的一个类中实例化另外一个类的同时,把自己的一个引用给对方。
    就这样。
    今天暂时思考到这里。


    展开全文
  • C++对象之间通信

    千次阅读 2010-12-11 21:08:00
    业和项目,然而对C++类对象之间通信总有种不知所措就好像人吃了饭自然会消化那样只知其然,不知起所以然的感觉。人,活着,好多时候是在寻找真理,其 实说俗点就是在找一个自己能够容易接受的理由来说服自己。...

    一直学习C++并使用C++完成了一个一个作 业和项目,然而对C++类对象之间的通信总有种不知所措就好像人吃了饭自然会消化那样只知其然,不知起所以然的感觉。人,活着,好多时候是在寻找真理,其 实说俗点就是在找一个自己能够容易接受的理由来说服自己。只是其会这样而不知为什么会这样有时会使人自己遭受心魔攻击。笔者就在写程序时总有股困扰在心中 挥之不去。于是,今天我决定狠下心驱除扰我已久心魔。

    在将对象消息传递方法之前,我们先声明C++对象之间消息传递区别于windows消息传递。这是两个完全不同的概念。C++对象之间通信消息是对 象A通过传参、全局数据等共有资源的修改,然后由对象B去调用自己的函数进行数据成员或全局数据的操作更新。该传递过程是在程序中实现,而windows 消息传递一般由操作系统对桌面或键盘进行捕捉后交由应用程序处理,不直接涉及到具体对象。

    C++对象之间通信总结有3点:

    (1) 通过定义消息结构体模拟windows进行消息传递。

    (2)对象A 通过对共享数据区和参数传递的修改后调用另一对象B的函数接口进行操作,实现消息之间通信。

    (3) 让对象A成为对象B的数据成员,实现消息通信

    展开全文
  • WebService之间相互通信的问题

    千次阅读 2016-11-21 21:13:48
    最近对已完结项目进行部署,遇到了一些以前没有想到过的问题,主要有两个,一个是WebService服务间相互通信的问题,另一个是WebService中global.asax的一些知识。下面进行总结: 首先是一个WebService如何调用另外...

    最近对已完结项目进行部署,遇到了一些以前没有想到过的问题,主要有两个,一个是WebService服务间相互通信的问题,另一个是WebService中global.asax的一些知识。下面进行总结:
    首先是一个WebService如何调用另外一个WebService,在VS2015中,只要在项目上右键,在菜单列表中添加服务引用就好。url写调试的时候地址栏中的地址就可以。但在部署时需要动态的改变地址怎么办呢?这就需要能从配置文件中读入发布好的地址了。
    使用Webservice的第一步应该是创建对象吧 是不是这样,看下面代码:

    public DB_Service.DBSoapClient sw = new DB_Service.DBSoapClient();
    如果你细心一点的话,右建这个构造方法查看一下转到定义试试。代码如下:
    
    public DBSoapClient() {}
    public DBSoapClient(string endpointConfigurationName): 
            base(endpointConfigurationName) {}
    public DBSoapClient(string endpointConfigurationName,   string remoteAddress) : 
            base(endpointConfigurationName, remoteAddress) {
            }
    public DBSoapClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(endpointConfigurationName, remoteAddress) {
            }
    public DBSoapClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                    base(binding, remoteAddress) {}

    可以看到,C#已经写好了动态调用的方法,原来我们提前设好的端口在Web.Config中已经写好:

    <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="SCYZT_DBSoap" closeTimeout="00:30:00" openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00" maxBufferSize="2147483647"
                        maxReceivedMessageSize="2147483647"/>
          </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://localhost:62119/SCYZT.DB.asmx" binding="basicHttpBinding"
            bindingConfiguration="SCYZT_DBSoap" contract="DB_Service.SCYZT_DBSoap"
            name="SCYZT_DBSoap" />
        </client>
      </system.serviceModel>

    我们在定义时用如下方法即可:

    public DB_Service.DBSoapClient sw = new DB_Service.DBSoapClient("Service1Soap","你要修改的URL例如:http://www.cckan.net/webservices.asmx");

    其中:”Service1Soap”就是Web.config中节点的Name属性值。

    第二就是WebService中global.asax的一些知识,global.asax是一个文本文件,它提供全局可用代码。这些代码包括应用程序的事件处理程序以及会话事件、方法和静态变量。有时该文件也被称为应用程序文件。
    global.asax 文件中的任何代码都是它所在的应用程序的一部分。每个应用程序在其根目录下只能有一个global.asax文件。然而,这个文件是可选的。如果没有global.asax文件,应用程序将对所有事件应用由 HttpApplication类提供的默认行为。
    提示:经典ASP有一个与global.asax类似格式和构造的,名为global.asa的文件。实际上,如果将一个正在运行的global.asa文件代码复制到global.asax中,应用程序同样可以运行。
    当应用程序运行的时候,global.asax的内容被编译到一个继承自HttpApplication类的类中。因此,HttpApplication类中所有的方法、类和对象对于应用程序都是可用的。
    项目只运用了global.asax的Application_Start方法,即程序启动时调用的函数,Application_Start 方法 是在第一个用户访问时才被调用的,并且只会被调用一次。读取配置文件的方法可以写于此。
    如果项目中没有global.asax文件,右键添加即可。

    展开全文
  • C++对象之间通信的三种常见方式

    万次阅读 2017-11-03 18:53:19
    经过这一年多对C++的使用,总结出了下边的三种常见对象之间通信方式。这里就上代码了。只作为一种设计思想,记录下来方便自已以后使用,和大家一起学习,这只是自已在工作中的总结,如果谁有更好的经验,请回复...
  • 关于对象之间通信的一点思考

    千次阅读 2012-08-07 01:33:04
    关于对象之间通信的一点思考 1. 经典的DDD的告诉我们如果一个领域概念是一个跨多个聚合的动作,比如转帐,那么就应该用领域服务来实现这样的业务概念。领域服务的输入和输出参数都是聚合根,领域服务内部...
  • 大家都知道在Air中嵌入的HTML控件中打开一个新的浏览器窗口是不行的,而通过Air本身的navigateToURL可以做到这点;...可能这种方式不是最优解决方案,不过通过这几天的研究倒是把JavaScript、Flex、Air之间相互通信
  • 闲话少说正题如下:本人在开发过程中曾经碰过一个疑惑:面向对象开发时候在类之间通信如何做?1:如果把所有的需要参数都通过结构指针传过去那么需要调用类的一些功能函数如何处理?2:我就写个全局变量吧,爱什么数据就...
  • 在并发编程中,经常会遇到多个线程之间需要相互协作的情况,即并不是多个线程同时执行,而是按照一定的顺序循环执行的情况。 那么怎样去实现这种效果呢?这里介绍三种方案。 这里都以子线程循环10次,然后主线程循环...
  • 第三种方法是用全局变量,但仍不能得知变量是否被修改过。 本人小白,不知道这种类的互相包含是否应该避免,如果是,(一般来说)应该如何设计类之间的关系。对于我这种情况,有什么途径实现类相互通信的功能呢?
  • 安卓中不同APP之间的消息通信

    万次阅读 2016-04-15 14:13:13
    昨天在腾讯实习生招聘初试面试时面试官问道我关于两个APP之间相互通信的方式,当时自己回道到了contentProvider与BroadcastReceiver。但他接着问还有没有其它的方式,我跟他说可以使用AIDL,但是当时没说清楚,所以...
  • 在iIOS 中 delegate 主要用于视图与使用对象之间通信交互,典型的特点就是它有返回值。 用途:常用于传\赋值(如tableView中的委托(dateSource)中常见)或者传递事件(例如在异步请求中,界面事件触发数据层改变...
  • 关于Java对象和XML之间相互转换

    千次阅读 2012-11-23 23:43:14
    最近参与的一个软件项目中,由于这个项目被划分为了几个子系统,并且需要和其他公司的系统进行交互... 在项目中有两种场景需要进行XML和java对象之间转换:  1、在两个系统之间同步数据  使用这种方式进行交互时,
  • 串行通信总结(实现两个单片机之间通信

    万次阅读 多人点赞 2017-01-06 11:47:59
    串行通信实现的是两个对象之间的数据传递,对象通常是单片机。通信实际上是在两个单片机上连上线,通过线路来传递信息。 如图,调制解调器非常重要,其作用是实现数字信号和模拟信号的转换。但是注意,调制解
  • 今天,我将全面讲解Android Native端与Flutter端通信的三种交互方式
  • 需求:主线程开启了多个线程去干活,每个线程需要完成...多线程和queue配合使用,实现子线程和主线程相互通信的例子 ''' import threading __author__ = "Kenny.Li" import Queue import time import r...
  • java中对象之间的交互

    千次阅读 2017-06-03 23:42:29
    1.对象之间的联系紧密程度叫耦合,耦合度越高,说明两个对象之间依赖性很强,相互牵扯的。我们理想的模型是对象与对象之间的耦合要尽可能的松,平行的对象要尽量减少直接联系,让更高的对象提供它们之间的通信服务。...
  • Fragment之间通信很简单……这里只是提供思路,无论是Fragment和Activity还是Fragment之间,通信的原理都是如此,所以Fragment之间通信不能直接通信,必须依靠所依附的Activity。 可以通过getSupportFragmentManager...
  • 关于在通过 事件对象 在服务程序和普通桌面应用程序相互之间通信的问题,分类情况进行讨论:1、普通桌面应用程序中创建事件,服务程序中打开事件 XP的情况普通桌面应用程序中创建:m_hEvent = ::CreateEvent(NULL...
  • 今天,我将主要讲解 Activity 与 Fragment 如何进行通信,实际上是要解决两个问题: Activity 如何传递数据到 Fragment? Fragment如何传递数据到Activity ? 下面,我将解答这两个问题。 阅读本文前,建议阅读...
  • java之服务器端和客户端之间简单的通信

    千次阅读 多人点赞 2018-05-13 17:04:48
    java之服务器端和客户端之间简单的通信 最近因为作业的需要,老师让用java语言写一个关于服务器端和客户端之间简单的通信,所以就有了这一篇文章 准备工作: 博主是在eclipse工具下进行操作的。 程序代码如下所...
  • Qt 多线程之间通信 实例 emit

    万次阅读 2017-07-09 15:21:12
    Qt的信号与槽机制可以将任何继承自QObject类的对象捆绑在一起,使不同对象之间能够相互通信
  • 当这些对象中的某些对象之间相互作用发生改变时,不会立即影响到其他的一些对象之间相互作用。从而保证这些相互作用可以彼此独立地变化。  今天主要是用调停者模式实现简单消息通信,写了简单的一个demo,拿...
  • 线程之间通信(thread signal)

    万次阅读 多人点赞 2016-07-08 17:57:04
    线程通信的目的是为了能够让线程之间相互发送信号。另外,线程通信还能够使得线程等待其它线程的信号,比如,线程B可以等待线程A的信号,这个信号可以是线程A已经处理完成的信号。通过共享对象通信有一个简单的实现...
  • 对象之间的耦合性

    千次阅读 2013-05-22 23:07:05
    数据耦合 数据耦合指两个模块之间有调用关系,传递的是简单的...公共耦合指通过一个公共数据环境相互作用的那些模块间的耦合.公共数据环境可以是全程变量或数据结构,共享的通信,内存的公共覆盖区及任何存储介质上的
  • 所以,各个组件之间肯定是需要相互联系,相互通信的。现在,我们来看下父子组件之间如何相互通信。1:父组件向子组件输送数据,主要通过props属性。props 可以是数组或对象,用于接收来自父组件的数据。props 可以是...
  • 多进程和多线程之间通信方式及通信实现步骤小结
  • 总结一下渲染进程和渲染进程之间通信方法: 方案一 使用全局共享属性(常用) // 主进程中在global上自定义对象 global.saveDefault= { token: 'default value', name: 'default value', password: 'default...
  • VC++中进程间相互通信的十一种方法

    千次阅读 2006-07-19 11:33:00
    VC++中进程间相互通信的十一种方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 134,484
精华内容 53,793
关键字:

对象之间不能相互通信