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

问题

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

诱导

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

实验

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

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

解答

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

  • FileChannel (管道的另一端是文件)
  • DatagramChannel (管道的另一端是基于UDP协议的client)
  • SocketChannel (管道的另一端是socket套接字,基于tcp的client)
在Linux上实现WebSphere MQ SVRCONN通道连接到多个队列并进行发送和接收,可以使用MQ客户端应用程序。以下是一个简单的示例,它使用Java编写,演示如何实现此过程: ```java import com.ibm.mq.*; public class MQClient { private static final String QMGR_NAME = "QMGR"; private static final String CHANNEL_NAME = "CHANNEL"; private static final String HOST_NAME = "localhost"; private static final int PORT = 1414; private static final String USER_NAME = "username"; private static final String PASSWORD = "password"; private static final String QUEUE_NAME_1 = "QUEUE1"; private static final String QUEUE_NAME_2 = "QUEUE2"; public static void main(String[] args) throws MQException { MQEnvironment.hostname = HOST_NAME; MQEnvironment.port = PORT; MQEnvironment.channel = CHANNEL_NAME; MQEnvironment.userID = USER_NAME; MQEnvironment.password = PASSWORD; MQQueueManager qmgr = new MQQueueManager(QMGR_NAME); MQQueue queue1 = qmgr.accessQueue(QUEUE_NAME_1, MQC.MQOO_OUTPUT); MQQueue queue2 = qmgr.accessQueue(QUEUE_NAME_2, MQC.MQOO_INPUT_AS_Q_DEF); MQMessage msg1 = new MQMessage(); msg1.writeString("Message 1"); MQPutMessageOptions pmo1 = new MQPutMessageOptions(); queue1.put(msg1, pmo1); MQMessage msg2 = new MQMessage(); MQGetMessageOptions gmo2 = new MQGetMessageOptions(); queue2.get(msg2, gmo2); System.out.println(msg2.readString()); queue1.close(); queue2.close(); qmgr.disconnect(); } } ``` 在这个示例中,我们创建了一个MQQueueManager对象,用于连接到WebSphere MQ队列管理器。然后,我们使用accessQueue方法打开了两个队列:一个用于发送消息,一个用于接收消息。最后,我们使用put和get方法向队列发送和接收消息。 通过在代码中添加更多的队列和消息操作,你可以实现WebSphere MQ SVRCONN通道连接到多个队列并进行发送和接收的功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值