一句话解释JAVA线程间通信

网上总结了10多种线程间通信的方式,看得我有些头晕,有的人说while轮询也是一种线程通信方式,我想问个问题,那我for轮询是不是也算一种轮询方式呢?问题的关键在于,怎样总结这些线程通信的模型。

我认为,线程通信只有两种,1.共享内存;2.线程间直接通信。再多的都是从这两种演化出来的实现方法。

共享内存通信

  1. await,notify
  2. join
  3. volatile
  4. cyclicBarrier
  5. AtomicInteger
  6. synchronized
  7. ReentrantLock,Condition

例子可能还有很多,这些通信的模型是一样的,在JVM堆空间有一个变量做控制符。我们通过对他的修改和一种保证线程安全的机制完成共享内存呢的通信,比如await,notify就是根据一个变量的值的变化而等待或释放,在这种情况下,实际上具体用的是synchronized还是ReentrantLock是没区别的。

这种方法的核心是根据变量的变化切换执行的线程,所以volatile也可以达到效果。

线程间直接通信

  1. Future
  2. PipedInputStream、PipedOutputStream

这一类方法不借助任何共享变量,直接在两个线程直接互通有无。第一种Futrue的callable接口继承了runnable增加了返回值,A线程发给B线程的消息通过返回值Future可以返回A,不严格的说,这也算是两个线程有了通信的效果。第二种方式是管道法,走IO流的概念,这更是教科书般的线程间直接通信的模版。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值