在Java中本地进行线程间数据传输的三种方式和源码展示

解道jdon 2021-05-04 14:47:05
java 线程 数据传输 进行 间数


在线程之间进行通信或发信号时首先想到的是java.lang.Object类方法:wait,notify和notifyAll。这是最基本和最广泛认可的概念,但本博客并非讲这些。

JVM实例上运行的线程缺少强大的预设模型,就像在UNIX中进行交互通信一样,尽管有一些第三方框架可以帮助我们实现这一意图并在角落案例中运行良好,本博客特别针对使用Java中的三个本地概念进行线程间通信: Cyclic Barrier循环屏障,Count Down Latch倒计时锁存和Pipes管道。

1.Cyclic Barrier

扩展java.util.concurrent.CyclicBarrier类以进行线程间数据传输。它基本上是一种同步技术,它允许每个线程的程序计数器在各个线程中的公共屏障点上停止,此时,可以使用共享状态传输数据,然后线程可以相应地继续。

演示的示例代码将使用生产者 - 消费者模型。父线程激活class.Producer和class.Consumer线程启动。当生产者从文件中读取数据时,消费者首先到达公共屏障并停止。生产者线程将结果存储在父线程的阻塞队列中。一旦生产者到达屏障点,此时生产者和消费者都会释放屏障,消费者从队列中检索数据并继续。

这个模型的一个好的用例是线程的输入依赖于另一个线程的输出。在这种情况下,消费者线程可以执行所有必要的启动并在屏障处等待接收输入数据。按照此github链接进行循环屏障的完整实施。

逻辑模板:
class.Producer thread 
step1:start 
step2:进行必要的计算和逻辑
step3:将要传输的所有数据写入阻塞队列
step4:达到循环屏障点,如果所有的线程都到达屏障点 - >继续
步骤5:进行清理和/或结束
class.Consumer thread 
step1:start 
step2:启动任何与生产者无关的数据逻辑处理
step3 到达循环屏障点,如果所有线程到达障碍 - >继续
step4:从队列中删除数据
step5:处理数据,清理并结束

2.Count Down Latch

这是一种在等待和到达模型中使用的同步技术,但它在这里以生产者 - 消费者方式实现。

生产者线程到达某一点,打上一个标志并立即继续前进,而不像循环屏障那样的生产者线程会暂停在这里,消费者线程在某个点停止开始程序计数器计数,一直等待生产者线程打上一个标志以后才继续运行。

这个模型可以被修改后可用于线程间通信。生产者线程在到达该点之前将一些数据推送到阻塞队列然后引发一个标志,等待的消费者跟踪所有这些标志并等待获得所需的标志号码,然后它开始从阻塞队列中提取数据。

演示的示例代码将具有两个生成器线程,一个消费者者线程和一个大小为2的有界阻塞队列。生产者线程每个读取不同的输入文件,然后将其传输到生产者线程,生产者线程将其打印到屏幕上。好用例是当服务器中的数据库对象仅批量写入时,它充当使用者并等待预设号码。许多生产者线程将其数据推入队列,引发标志并继续而不等待。按照这个github链接进行倒计时锁存器的完整实现。

逻辑模板:
class.Producer1和class.Producer2
step1:启动 
step2:做必要的计算和逻辑
step3:写入要传输的所有数据到阻塞队列
step4:打上标志并继续而不等待
step5:做一些逻辑并结束
class.Consumer 
step1:启动
step2:做一些逻辑并等待一个点接收数据
step3:跟踪标志/锁存器,如果数量到达 - >继续
step4:从队列中拉出数据step5 
:使用数据并结束

3.来自java.io的Pipes

 class.PipedReader 和class.PipedWriter 允许在定义的点与其他线程直接通信。生产者和消费者必须共同访问某一点,生产开始以块的形式推送数据,正在等待管道打开的消费者者开始提取数据。

理解和实施这个概念相对简单。pipe在现场环境中表现不佳,因此在开发人员社区中已被弃用。另一个主要缺点是它仅支持一对一转移。只能有一个生产者和一个消费者。一个很好的用例是当它用于在一次性任务中引导数据时,它与较新的java.nio包一起使用。关注pipeReader和pipeWriter完整实现的github链接。

逻辑模板
class.Producer thread 
step1:启动
step2:做一些逻辑并到达执行管道的循环
step3:将数据推入流中并在完成后继续
step4:做一些逻辑并结束
class.Consumer thread 
step1:启动
step2:做一些逻辑并到达管道读取器点
step3:一旦管道有值拉数据并存储它
step5:完全读取所有数据,做一些逻辑并结束

异构线程之间的线程间通信的三种方式只是作者在完成工作时修改/扩展本机概念的努力。如在用例场景中所理解的,倒计时锁存器具有更广泛的可用性范围并且可以被广泛采用。

一个主要提示是异常,提供障碍或锁存器具有底层异常,异常处理程序也有机会重试数据传输。这些概念的实现很广泛,本博客试图将生产者 - 消费者的注释和github示例放入其中。

版权声明
本文为[解道jdon]所创,转载请带上原文链接,感谢
https://www.jdon.com/51801

  1. ASP调用SDK微信分享好友、朋友圈
  2. ASP calls SDK wechat to share friends and circle of friends
  3. SpringCloud(六)Bus消息总线
  4. 详解JavaScript中的正则表达式
  5. Springcloud (6) bus message bus
  6. Explain regular expressions in JavaScript
  7. Java 响应式关系数据库连接了解一下
  8. Java14它真的来了, 真是尾气都吃不到了
  9. 视频:使用Docker搭建RabbitMQ环境
  10. Java responsive relational database connection
  11. Java14 it's really coming. I can't eat the exhaust
  12. Video: building rabbitmq environment with docker
  13. SpringCloud(六)Bus消息总线
  14. 详解JavaScript中的正则表达式
  15. Springcloud (6) bus message bus
  16. Explain regular expressions in JavaScript
  17. Docker实战:用docker-compose搭建Laravel开发环境
  18. Docker: building laravel development environment with docker compose
  19. 求助,JAVA如何获取系统当前所有进程
  20. 有人用过JMeter或用HttpUnit写过测试吗????
  21. Help, Java how to get all the current processes of the system
  22. Has anyone ever used JMeter or written tests in httpUnit????
  23. Living in a mountain village in late spring
  24. Partridge day, spring of HKUST
  25. JavaScript异步编程4——Promise错误处理
  26. 海康摄像SDK开发笔记(一):海康威视网络摄像头SDK介绍与模块功能
  27. JavaScript asynchronous programming 4 -- promise error handling
  28. Haikang video SDK development notes (1): introduction and module functions of Hikvision webcam SDK
  29. JOP:用于FPGA的嵌入式实时系统中的Java优化处理器内核
  30. Spring Boot源码:使用MongoDB MongoTemplate公开REST在几分钟内实现CRUD功能
  31. Spring Boot应用程序事件教程 - reflectoring
  32. 带有Resilience4j断路器的Spring云网关 - rome
  33. 经验分享:Apache Kafka的缺点与陷阱 - Emil Koutanov
  34. 通过Spring Boot Webflux实现Reactor Kafka
  35. 从Java 8升级到Java 11应该注意的问题
  36. Jop: Java optimized processor core for FPGA embedded real time system
  37. Spring boot source code: use mongodb mongotemplate to open rest to realize crud function in a few minutes
  38. Spring boot application event tutorial - reflecting
  39. Spring cloud gateway with resilience4j circuit breaker - ROM
  40. Experience sharing: shortcomings and pitfalls of Apache Kafka - Emil koutanov
  41. Realization of reactor Kafka through spring boot Webflux
  42. RPC框架设计----Socket与I/0模型
  43. Problems in upgrading from Java 8 to Java 11
  44. RPC framework design -- socket and I / 0 model
  45. RPC框架设计----I/0模型
  46. RPC framework design: I / 0 model
  47. RPC框架设计----NIO编程缓冲区Buffer
  48. RPC框架设计----NIO编程缓冲区Buffer
  49. RPC framework design -- NiO programming buffer
  50. RPC framework design -- NiO programming buffer
  51. Java多线程基础
  52. Java multithreading Foundation
  53. 码农飞升记-00-Java发展历程
  54. Development history of coder-00-java
  55. 码农飞升记-00-Java发展历程
  56. Development history of coder-00-java
  57. Spring and Autumn Moon
  58. Node.js与Spring Boot比较? - Ryan Gleason
  59. Spring WebFlux的明显陷阱 - ŁukaszKyć
  60. Spring创始人Rod大叔对YAML的真实想法