zoukankan      html  css  js  c++  java
  • java多线程编程核心技术(三)--线程间通信

    1、等待/通知机制

      1、wait()方法:使当前执行代码的线程进行等待。wait()方法是Object类的方法,该方法将当前线程放入“预执行队列”中,并在wait()所处的代码行处停止执行。只到被唤起或被中断。

             在调用wait()之前,线程必须获取该对象的锁,所以该方法只能在同步方法或同步代码块中执行,执行wait()之后,当前线程会释放锁。

      2、notify()方法:该方法的作用是用来唤起等待该对象锁的其它线程,如果有多个线程等待,则由线程规划器随机唤起一个wait()状态的线程,该方法也只能在同步方法或同步代码块中执行。

              在执行notify()之后,当前线程不会马上释放锁。要等到执行notify()方法的线程将程序执行完,也就是退出synchronized代码块后,才会释放锁。

      3、interrupt():中断线程。当线程是wait状态时,调用interrupt()会出现InterruptedExceptiom异常。

      4、notifyAll(): 唤醒其它所有等待的线程。

      5、wait(long):等待在一段时间内是否有线程对锁唤醒,如果到时间则自动唤醒。  

      6、在多生产者多消费者模式中,使用notify(),有可能会因为连续唤起同类而造成程序假死。可以使用notifyAll()将所有等待线程唤起来解决。

      8、java提供了四个类来让线程间通信,分别是 PipedInputStream、PipedOutputStream、PipedReader、PipedWriter。

    2、join()的使用

      1、thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。join()底层通过wait()方法实现,

        当main线程调用t.join时候,main线程会获得线程对象t的锁,然后main线程进入wait状态,只到t线程执行完,或者唤起main线程

      2、join(long):设定等待时间。

    3、ThreadLocal的使用

      1、ThreadLocal解决的是变量在不同线程间的隔离性。不同的线程拥有自己的值。

      2、继承Threadlocal并重写initialValue(),可以使ThreadLocal具有初始值。

    4、InheritableThreadLocal的使用

      1、InheritableThreadLocal可以在子线程中获取父线程继承下来的值。

  • 相关阅读:
    bzoj1494 生成树计数 (dp+矩阵快速幂)
    hdu3516 Tree Construction (区间dp+四边形优化)
    luogu3628 特别行动队 (斜率优化dp)
    luogu3195/bzoj1010 玩具装箱(斜率优化dp)
    poj1038 Bugs Integrated,Inc. (状压dp)
    bzoj1597/luogu2900 土地购买 (斜率优化dp)
    bzoj4518/luogu4072 征途(斜率优化dp)
    pandas read_csv
    pandas series和pd.Dataframe区别
    python3 mro
  • 原文地址:https://www.cnblogs.com/shun-gege/p/7867206.html
Copyright © 2011-2022 走看看