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

原文地址:https://www.cnblogs.com/shun-gege/p/7867206.html