zoukankan      html  css  js  c++  java
  • 线程通信

    1、线程的协调运行

    Object类提供wait()、notify()和notifyAll()三个方法,不属于Thread类,这三个方法必须由同步监视器对象来调用     在同步方法和同步方法块中使用

    wait():导致当前线程等待,直到其他线程调用该同步监视器的notify()或notifyAll()方法来唤醒改线程,调用wait()方法的当前线程会释放对该同步监视器的锁定

    notify():唤醒在此同步监视器上等待的单个线程。如果有多个,任意选取其中一个,只有当前线程放弃对该同步监视器的锁定后(使用wait()方法),才可以执行被唤醒的线程

    notifyAll():唤醒在此同步监视器上等待的所有线程。

    2、使用条件变量控制协调

    如果不使用synchronized来保证同步,而是直接使用Lock来保证同步,则系统中不存在同步监视器对象,不能使用上述三个方法

    当使用Lock对象保证同步时,用Condition来保持协调,其可以让那些已经得到Lock对象却无法继续执行的线程释放Lock对象,Condition对象也可以唤醒其他处于等待的线程

    要获得Lock实例的Condition实例,调用Lock对象newCondition() 方法即可

    await():导致当前线程等待,直到其他线程调用该Condition的signal()或signalAll()方法来唤醒改线程,

    signal():唤醒在此Lock对象上等待的单个线程。如果有多个,任意选取其中一个,只有当前线程放弃对该Lock对象的锁定后(使用await()方法),才可以执行被唤醒的线程

    signalAll():唤醒在此Lock对象上等待的所有线程

    3、使用管道流

    PipedInputStream和PipedOutputStream   管道字节流

    PipedReader和PipedWriter                      管道字符流

    Piped.SinkChannel和Piped.SourceChannel  新IO的管道Channel

    步骤:

    1)使用new操作符分别创建管道输入流和输出流

    2)使用管道输入流或输出流的connect方法把两个输入流和输出流连接起来

    3)将管道输入流输出流分别传入两个线程

    4)两个线程可以分别依赖各自的管道输入流、输出流进行通信

  • 相关阅读:
    iOS开发tips-UITableView、UICollectionView行高/尺寸自适应
    10559
    日志系统之基于Zookeeper的分布式协同设计
    IOS 图片上传处理 图片压缩 图片处理
    istream, outstream使用及常见错误
    matlab 扩大虚拟内存
    github不小心同步覆盖了本地文件
    经典统计语言模型
    Makefile 快速入门
    word2vec——高效word特征提取
  • 原文地址:https://www.cnblogs.com/liutoutou/p/3328674.html
Copyright © 2011-2022 走看看