线程之前如何通信

线程之间为什么要进行通信
线程是操作系统调度的最小单位,有自己的栈(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进行通信。像消息传递机制,也就是说:通过管道,将一个线程中的消息发送给另一个。

原文链接:https://blog.csdn.net/weixin_46487176/article/details/122995466

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章