• 线程通信


    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)两个线程可以分别依赖各自的管道输入流、输出流进行通信

  • 相关阅读:
    SpringAOP里JoinPoint常用方法总结
    Hutool工具
    github配置.gitignore忽略版本文件
    IDEA集成Docker部署微服务
    mybatisplus插入报错argument type mismatch
    mysql 主从复制遇到的坑
    博客园文档树参考涉案值
    MySQL分库分表和优化
    mycat中文乱码-解决方案
    ElasticSearch&Docker&Kafka
  • 原文地址:https://www.cnblogs.com/liutoutou/p/3328674.html
Copyright © 2020-2023  润新知