1. 程式人生 > >通道(channel)和佇列(queue)的區別

通道(channel)和佇列(queue)的區別

問題

有人會有疑問,通道和佇列都是可以丟一些資料進去,可以拿一些資料出來。比如通道有read和write的方法,佇列有put和take的方法,通道和佇列有什麼區別呢?為什麼一個叫做通道,一個叫做佇列呢?

誘導

如果要從各方面來比較的話,會容易把人給說暈了。其實它們最根本最本質的區別就一個。只要這一點把握住了,理解透了,那麼其他的不同就引刃而解了。而如果這一點都沒有搞明白的話,其他東西說的再多,也是白搭。

實驗

大家有沒有做過這樣一個實驗。假設一個程式(或者一個執行緒),它有一個通道變數叫做channel,也有一個佇列變數叫做queue。當這個執行緒呼叫queue.put(“我靠”)之後,再繼續呼叫queue.take(),就可以把”我靠”又取了出來。但是如果這個執行緒呼叫channel.write(“我靠”),再呼叫一萬遍channel.read(),你也不可能讀到”我靠”了。

這麼一說,大家有沒有發現本質區別了?

解答

佇列物件就是一個儲存,你扔東西進去,你自己也可以把它再拿出來。但是初始化通道變數的時候,你必須指定這個通道的另一端。你丟東西進去,就像丟到一個下水管道里面一樣,你自己是拿不出來的。只有通道的另一端才可以拿到這個資料。

  • FileChannel (管道的另一端是檔案)
  • DatagramChannel (管道的另一端是基於UDP協議的client)
  • SocketChannel (管道的另一端是socket套接字,基於tcp的client)