zoukankan      html  css  js  c++  java
  • java多线程

    当线程在系统内运行时,程序通常无法准确控制线程的轮换执行,但是可以通过一些机制来保证线程协调运行。

    由同步监视器对象协调线程

    实现这种功能可以借助于Object类提供的wait()、notify()、notifyAll()三个方法(注意,这三个方法属于Object类,不属于Thread类)。这三个方法必须由同步监视器来调用,可以分为两种情况:

    • 对于同步方法,同步监视器默认是当前实例(this),所以可以在同步方法中直接调用这三个方法;
    • 对于同步代码块,同步监视器是synchronized后括号里的对象,必须使用该对象调用这三个方法。

    介绍下这三个方法:

    wait():导致当前线程等待(由运行进入阻塞),直到其他线程调用该同步监视器的notify()或notifyAll()方法来唤醒该线程。wait()方法会使当前线程释放对同步监视器的锁定;

    notify():唤醒(由阻塞进入就绪)在同步监视器上等待的一个线程。如果多个线程都此同步监视器上等待,则会任意唤醒其中一个线程。被唤醒的线程不能立即执行,需要当前线程释放对同步监视器的锁定后才可以;

    notifyAll:唤醒在同步监视器上等待的所有线程。同样被唤醒的线程不能立即执行,需要当前线程释放对同步监视器的锁定后才可以获得执行的机会。

    使用条件变量协调控制线程

    当线程使用同步锁来实现线程同步时,系统中不存在隐式的同步监视对象,也就不能使用wait()、notify()、notifyAll()来协调线程。

    当使用Lock对象保证线程同步时,Java提供了Condition类来协调线程通信。Condition实例实质上被绑定在Lock对象上,要获得特定Lock的Condition实例,使用该对象的newCondition()方法即可。

    Condition提供了await()、signal()、signalAll()来实现线程协调。这三个方法分别对应同步监视器对象的wait()、notify()、notifyAll()方法,只不过调用者不同罢了。

    使用管道流进行线程通信

    管道流分为三大类:管道字节流(PipedInputStream和PipedOutputStream)、管道字符流(PipedReader和PipedWriter)和新IO管道(Pipe.SinkChannel和Pipe.SourceChannel)。

    使用管道流进行线程通信可按如下步骤进行:

    1. 使用new关键字分别创建管道输入流和管道输出流;
    2. 使用管道输入流或管道输出流的connect方法把两个输入流和输出流连接起来;
    3. 将管道输入流、管道输出流分别传入两个线程;
    4. 两个线程分别依赖各自的管道输入流、管道输出流进行通信。

    尽量少使用管道流进行通信,最好的方式还是使用线程共享数据进行通信。

  • 相关阅读:
    WCF服务自我寄宿 Windows服务
    客户端调用 WCF 的几种方式
    SQL Server 2005 数据库 可疑状态
    mysql server 自动断开的问题
    mysql数据表简单拷贝及重命名
    Mac提示App已损坏 你应该将它移到废纸篓的解决方案
    Mac系统下安装Tomcat,以及终端出现No such file or directory的错误提示解决方案
    md1
    转-SourceTree注册atlassian账号SIGUP按钮灰色无法注册的问题
    mysql my.cnf优化
  • 原文地址:https://www.cnblogs.com/amunote/p/4136158.html
Copyright © 2011-2022 走看看