Java并发--线程间的通信

1.wait()/notify()机制

  1. wait()/notify()都是Object对象的方法,且只能在同步方法或同步块中调用。
  2. wait()方法使当前线程等待,在wait()执行的地方暂停执行,并释放锁,知道接到通知或被中断为止。
  3. notify()用来通知那些可能等该该锁的其他线程。若有多个线程等待,则按照执行wait()方法的顺序通知(notify)等待的线程。执行notify()方法后,当前线程不会马上释放该锁,呈wait()状态的线程也并不能马上获取该对象锁,要等到执行notify()方法的线程退出synchronized同步区域后,当前线程才会释放锁,wait状态的线程获得对象锁。
  4. 当线程调用wait()方法后,再对该线程对象执行interrupt()方法会出现InterruptedException异常
  5. 每调用一次notify()方法,只通知一个线程进行唤醒,唤醒的顺序与执行wait()方法的顺序一致。
  6. notifyAll()方法会按照执行wait()方法的倒序依次对其他线程进行唤醒。
  7. wait(long)方法是指等到某一时间内是否有线程对锁进行notify()通知唤醒,如果超过这个时间则线程自动唤醒。自动唤醒后需要持有锁,如果没有锁,则一直等待,直到持有锁为止。

2. 通过管道进行线程间通信--字节流,字符流

3. join()方法

  1. join()方法的作用是使所属的线程对象x正常执行run()方法,而使当前线程z进行无限期的阻塞,等待线程x销毁后在继续执行线程z后面的代码,具有串联执行的效果。
  2. join()方法具有使线程排队运行的效果,有些类似同步的运行效果。但是,join()方法与synchronized的区别是join()方法在内部使用wait()方法进行等待,而synchronized关键字使用锁进行同步。
  3. join(long)方法中的参数用于设定等待的时间,不管当前线程是否执行结束,时间到了并且重新获得了锁,则当前线程会继续向后运行。如果没有重新获得锁,则一直尝试,知道获得锁为止。

4.类ThreadLocal的使用

  1. 类threadLocal的主要作用是将数据放入当前线程对象中的Map中,这个Map是Thread类的实例变量。类ThreadLocal自己不管理类,不存储任何数据,它只是数据和Map之间的桥梁,用于将数据放入Map中。(P274 Java多线程编程核心技术)
  2. 类InheritableThreadLocal可以让子线程从父线程继承值。(P286)
  • 父线程有最新的值,子线程仍是旧值。
  • 子线程有最新的值,父线程仍是旧值。
  • 子线程可以感应对象属性值的变化。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容