• 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可以在子线程中获取父线程继承下来的值。

  • 相关阅读:
    Postman使用
    Java-性能调优-理解GC日志
    Java-性能调优实战(jps、jstack)
    Java-性能调优工具-jstat
    Java-内存模型
    生产者消费者JAVA实现
    Java-GC垃圾收集器
    JAVA-JVM垃圾回收算法
    Java线程状态流转---线程
    【洛谷5072】[Ynoi2015] 盼君勿忘(莫队)
  • 原文地址:https://www.cnblogs.com/shun-gege/p/7867206.html
Copyright © 2020-2023  润新知