说到线程之间通信方式:主要是有两种吧1.是通过共享变量,线程之间通过该变量进行协作通信。2.通过队列(本质上也是线程间共享同一块内存)来实现消费者和生产者的模式来进行通信。
1. 通过线程之间共享变量的方式
这个就有必要说下wait(),notify(),以及notifyAll() 这三个方法。这三个方法都是属于Object的方法;所以所有类都可以继承这三方法;wait()方法使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法。notify()方法会唤醒一个等待当前对象的锁的线程。而notifyAll()顾名思义;就是唤醒所有在等待中的方法。wait()和notify()方法要求在调用时线程已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或synchronized块中。
lock、读写锁、volatile、信号量
2. 通过队列来实现线程的通信
这里用的是java.util.concurrent包中linkedBlockingQueue 来进行线程间交互。LinkedBlockingQueue 内部以一个链式结构(链接节点)对其元素进行存储。如果需要的话,这一链式结构可以选择一个上限。如果没有定义上限,将使用 Integer.MAX_VALUE 作为上限。LinkedBlockingQueue 内部以 FIFO(先进先出)的顺序对元素进行存储。队列中的头元素在所有元素之中是放入时间最久的那个,而尾元素则是最短的那个。
这里通过共享一个队列的信息,实现生产者和消费者。(关于生产者消费者又可以说一大堆)。