通道(channel)和队列(queue)的区别

问题

有人会有疑问,通道和队列都是可以丢一些数据进去,可以拿一些数据出来。比如通道有read和write的方法,队列有put和take的方法,通道和队列有什么区别呢?为什么一个叫做通道,一个叫做队列呢?

诱导

如果要从各方面来比较的话,会容易把人给说晕了。其实它们最根本最本质的区别就一个。只要这一点把握住了,理解透了,那么其他的不同就引刃而解了。而如果这一点都没有搞明白的话,其他东西说的再多,也是白搭。

实验

大家有没有做过这样一个实验。假设一个程序(或者一个线程),它有一个通道变量叫做channel,也有一个队列变量叫做queue。当这个线程调用queue.put(“我靠”)之后,再继续调用queue.take(),就可以把”我靠”又取了出来。但是如果这个线程调用channel.write(“我靠”),再调用一万遍channel.read(),你也不可能读到”我靠”了。

这么一说,大家有没有发现本质区别了?

解答

队列对象就是一个存储,你扔东西进去,你自己也可以把它再拿出来。但是初始化通道变量的时候,你必须指定这个通道的另一端。你丢东西进去,就像丢到一个下水管道里面一样,你自己是拿不出来的。只有通道的另一端才可以拿到这个数据。

  • FileChannel (管道的另一端是文件)
  • DatagramChannel (管道的另一端是基于UDP协议的client)
  • SocketChannel (管道的另一端是socket套接字,基于tcp的client)

猜你喜欢

转载自blog.csdn.net/leon_wzm/article/details/79354360