Java如何在两个线程间进行通讯

61次阅读
没有评论

共计 1257 个字符,预计需要花费 4 分钟才能阅读完成。

这篇文章主要介绍“Java 如何在两个线程间进行通讯”,在日常操作中,相信很多人在 Java 如何在两个线程间进行通讯问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java 如何在两个线程间进行通讯”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间如何交换信息。
目前有两种方式:

共享内存

消息传递(actor 模型)

# 共享内存
共享内存这种方式比较常见,我们经常会设置一个共享变量。然后多个线程去操作同一个共享变量。从而达到线程通讯的目的。例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量 count 来记录任务完成的数量。每当一个线程完成抓取任务,会在原来的 count 上执行加 1 操作。这样每个线程都可以通过获取这个 count 变量来获得当前任务的完成情况。当然必须要考虑的是共享变量的同步问题,这也共享内存容易出错的原因所在。

这种通讯模型中,不同的线程之间是没有直接联系的。都是通过共享变量这个“中间人”来进行交互。而这个“中间人”必要情况下还需被保护在临界区内(加锁或同步)。由此可见,一旦共享变量变得多起来,并且涉及到多种不同线程对象的交互,这种管理会变得非常复杂,极容易出现死锁等问题。
给出案例

# 消息传递
消息传递方式采取的是线程之间的直接通信,不同的线程之间通过显式的发送消息来达到交互目的。消息传递最有名的方式应该是 actor 模型了。在这种模型下,一切都是 actor,所有的 actor 之间的通信都必须通过传递消息才能达到。每个 actor 都有一个收件箱(消息队列)用来保存收到其他 actor 传递来的消息。actor 自己也可以给自己发送消息。这才是面向对象的精髓啊!

这种模型看起来比共享内存模型要复杂。但是一旦碰到复杂业务的话,actor 模型的优势就体现出来了。我们还是以刚才多线程抓取网站为例子看一下在这种模型下如何去解决。
首先我们定义一个统计 actor 用来统计任务完成量。然后把多个网址(消息方式)发给多个抓取 actor,抓取 actor 处理完任务后发送消息通知统计 actor 任务完成,统计 actor 对自己保存的变量 count(这个只有统计 actor 才能看到)加一。
最后让我们来总结一下这两种通讯模式:

并发模型通信机制同步机制共享内存线程之间共享程序的公共状态,线程之间通过写 - 读内存中的公共状态来隐式进行通信同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。消息传递(actor) 线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信. 由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。

到此,关于“Java 如何在两个线程间进行通讯”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计1257字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)