多线程知识3-线程间通信
来源:互联网 发布:怎么在淘宝买东西便宜 编辑:程序博客网 时间:2024/06/06 05:34
常用的线程间通信实现:
(1)等待/通知机制:wait/Notify实现进程间通信
(2):生产者消费者实现
(3):管道
(4).join()方法,
(5)ThreadLocal类的使用。
(1):等待通知机制的实现:wait方法是使当前执行代码的线程进行等待。
是object的方法,该方法将线程放入预处理队列中,并且在该处停止执行。
会释放锁。在调用wait之前,必须要有对象锁,也就是说必须在同步方法或者同步块中使用。如果没有适当的锁,会抛出:IllegalMonitorStateException异常。而notify也要在同步块中调用,用来通知那些等待该对象锁的其他线程,如果有多个线程,由jvm选择一个即可,用notifyAll则是通知所有等待的线程:注意的是:通知之后不会立即释放锁,而是退出Synchronized块的时候,才会释放。
每个锁对象都有两个队列,就绪队列和阻塞队列。
Wait被执行后锁自动释放,notify执行后,锁不释放。
当线程处于wait状态时,执行interrupt会出现InterruptException异常。
执行完同步代码块就会自动释放锁
在同步代码块执行过程中要是出现异常,会释放锁
(2):生产者消费者模式:一对一模式,多对多模式可能出现假死的现象,出现假死的原因是连续唤醒的是同类。解决方法是用notifyAll.
(3)通过管道通信:一。字节流,管道流是一种特殊的流,用于在不同的线程间进行通信,通信的介质是内存。一个线程发送数据到输出管道PipedOutputStream,另一个线程从输入管道读出数据。在jdk中提供了四个类来使线程可以通信:PipedInputStream,PipedOutputStream,PipedReader,PipedWriter
使用inputStream.connect(outputstream),或者OutputStream.connect(inputstream)可以使两个Stream之间产生通信连接,这样才可以进行数据的输入和输出。
(4)Join:在很多情况下,主线程创建了子线程,但是子线程有大量的耗时计算,主线程往往结束的早,着时候要是主线程要等子线程结束再结束就要用join,join的作用是等待线程对象销毁。
Join也有使线程进行排队等待的作用,类似于同步的效果
但是Join与Synchronized的区别是:join在内部使用的是wait方法进行等待,而Synchronized使用的是对象监视器的原理作为同步。
Join(long)方法具有释放锁的特点,因为在内部是wait(long)实现的.Thread.sleep(long)却不释放锁。
(5):每一个线程都有自己共享的实例变量,ThreadLocal类就是解决这样的问题。将ThreadLocal类比作一个盒子,每个盒子中可以存储每个线程的私有数据。ThreadLocal解决的是不同线程之间的隔离性,也就是说每个线程拥有自己的值,不同线程中的值是可以放到该类中进行保存。
- 多线程知识3-线程间通信
- 多线程线程间通信
- 多线程与线程间通信
- 【多线程】线程间的通信
- Java多线程--线程间通信
- day12 多线程-线程间通信
- 多线程-线程间的通信
- 多线程(3)- 线程通信
- Java的多线程-线程间的通信(3)
- 赵雅智_java 多线程(3)之线程间的通信
- Java多线程编程3--线程间通信--生产者/消费者模式
- 《java多线程编程核心技术》读书笔记3:线程间的通信
- java多线程编程核心技术3-线程间通信
- 多线程学习笔记3-线程间的通信(1)
- java多线程3(线程间的通信)
- Java多线程(3)——线程间通信
- 进程间通信与线程间通信 . windows下多线程通信方法 Linux 多线程通信
- 多线程专题之线程间的通信
- foreach、mouse event、<hr>、<a>、date()
- 文件压缩
- BZOJ1731: [Usaco2005 dec]Layout 排队布局 差分约束 spfa
- 安卓二级缓存
- navicat for mysql的下载、安装与基本使用
- 多线程知识3-线程间通信
- Spark集群启动python shell错误: Could not resolve hostname localhost: Temporary failure
- 相关事件
- poj 1753 Flip Game
- poj 3368 Frequent values (RMQ或线段树)
- 多种CSMA策略的比较
- lua源码的研究入门之makefile
- iOS 常用的第三方库
- Label--自定义可调整内边距的Label