Java⾯试--线程之间是如何通信
Java⾯试--线程之间是如何通信
pipedinputstream线程之间为什么要进⾏通信
线程是操作系统调度的最⼩单位,有⾃⼰的栈(JVM中的虚拟机stack)空间,可以按照既定的代码逐步的执⾏,但是如果每个线程间都孤⽴的运⾏,那就会造资源浪费。所以在现实中,我们需要这些线程间可以按照指定的规则共同完成⼀件任务,所以这些线程之间就需要互相协调,这个过程被称为线程的通信。
多个线程并发执⾏时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成⼀件任务,并且我们希望他们有规律的执⾏, 那么多线程之间需要⼀些协调通信,以此来帮我们达到多线程共同操作⼀份数据。
当然如果我们没有使⽤线程通信来使⽤多线程共同操作同⼀份数据的话,虽然可以实现,但是在很⼤程度会造成多线程之间对同⼀共享变量的争夺,那样的话势必为造成很多错误和损失!
所以,我们才引出了线程之间的通信,多线程之间的通信能够避免对同⼀共享变量的争夺。
线程的通信可以被定义为:线程通信就是当多个线程共同操作共享的资源时,互相告知⾃⼰的状态以避免资源争夺。
线程通信的⽅式
线程通信主要可以分为三种⽅式,分别为共享内存、消息传递(也叫等待-通知)和管道流。每种⽅式有不同的⽅法来实现。在Java中线程之间的通信⽅式总共有8种,分别是:volatile、synchronized、interrupt、wait、notify、notifyAll、join、管道输⼊/输出
共享内存:线程之间共享程序的公共状态,线程之间通过读-写内存中的公共状态来隐式通信。⽐如 volatile 保证内存的可见性。
消息传递:线程之间没有公共的状态,线程之间必须通过明确的发送信息来显⽰的进⾏通信。⽐如 wait/notify/notifyAll等待通知⽅式和join⽅式。
多个线程在处理同⼀个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同⼀个变量的使⽤或操作。就是多个线程在操作同⼀份数据时,避免对同⼀共享变量的争夺。于是我们引出了等待唤醒机制:(wait()、notify())。notifyAll的使⽤情景是存在多个⽣产者和消费者。
等待通知机制是基于wait和notify⽅法来实现的,在⼀个线程内调⽤该线程锁对象的wait⽅法,线程将
进⼊等待队列进⾏等待直到被通知或者被唤醒。
管道流:管道流是是⼀种使⽤⽐较少的线程间通信⽅式,管道输⼊/输出流和普通⽂件输⼊/输出流或者⽹络输出/输出流不同之处在于,它主要⽤于线程之间的数据传输,传输的媒介为管道。⽐如管道输⼊/输出
管道通信就是使⽤java.io.PipedInputStream 和 java.io.PipedOutputStream进⾏通信。像消息传递机制,也就是说:通过管道,将⼀个线程中的消息发送给另⼀个。