Selector select方法阻塞register的解决方法

1. 监听端口, 当连接到来的时候创建socketChannel

public class MultiServer {

	public static void main(String[] args) throws IOException {
		ServerSocketChannel ss = ServerSocketChannel.open().bind(
				new InetSocketAddress(8484));
		final Selector selector = Selector.open();
		wuTiRaw(selector);
		while (true) {
			SocketChannel channel = ss.accept();
			channel.configureBlocking(false);
			channel.register(selector, SelectionKey.OP_READ);
		}
	}

	private static void wuTiRaw(final Selector selector) {
		Thread t = new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						selector.select();
						Set<SelectionKey> keys = selector
								.selectedKeys();
						Iterator<SelectionKey> it = keys.iterator();
						while (it.hasNext()) {
							SelectionKey next = it.next();
							if (next.isReadable()) {
								ByteBuffer bb = ByteBuffer.allocate(10);
					
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Selector类提供了一种选择通道的机制,可以通过Selector注册Channel并监视它们上面发生的事件。以下是Java Selector类中常用的50个方法: 1. open():打开一个新的Selector 2. open(DatagramChannel dc):使用指定的DatagramChannel创建一个新的Selector 3. isOpen():判断Selector是否处于打开状态 4. close():关闭Selector 5. keys():返回所有当前注册的SelectionKey 6. selectedKeys():返回所有已经准备就绪的SelectionKey 7. select():开始选择已经准备就绪的键集合 8. select(long timeout):在指定时间内选择已经准备就绪的键集合 9. selectNow():立即返回准备就绪的键集合,不阻塞 10. wakeup():使一个阻塞Selector立即返回 11. selectedKeys().remove(key):移除一个已经处理过的SelectionKey 12. keys().size():返回已经注册的SelectionKey数量 13. selectedKeys().size():返回已经准备就绪的SelectionKey数量 14. keys().iterator():返回已经注册的SelectionKey迭代器 15. selectedKeys().iterator():返回已经准备就绪的SelectionKey迭代器 16. select(int numKeys):选择指定数量的已经准备就绪的键集合 17. validOps():返回Selector支持的操作集合 18. select(Selector selector):开始选择已经准备就绪的键集合,并将其复制到另一个Selector 19. select(Selector selector, long timeout):在指定时间内选择已经准备就绪的键集合,并将其复制到另一个Selector 20. register(SelectableChannel ch, int ops):将通道注册到Selector,监视特定事件 21. register(SelectableChannel ch, int ops, Object att):将通道注册到Selector,监视特定事件,并关联一个附件 22. keys().clear():清除所有已经注册的SelectionKey 23. selectedKeys().clear():清除所有已经准备就绪的SelectionKey 24. wakeup():唤醒一个正在阻塞Selector 25. attach(Object ob):关联一个附件 26. attachment():返回与当前SelectionKey关联的附件 27. interestOps():返回Selector监视的当前通道的事件集合 28. interestOps(int ops):设置Selector监视的当前通道的事件集合 29. selector():返回Selector实例 30. channel():返回与当前SelectionKey关联的通道 31. readyOps():返回当前SelectionKey准备好的操作集合 32. isReadable():判断当前SelectionKey是否可读 33. isWritable():判断当前SelectionKey是否可写 34. isAcceptable():判断当前SelectionKey是否可接受连接 35. isConnectable():判断当前SelectionKey是否可建立连接 36. selector().keys():返回所有已经注册的SelectionKey 37. selector().selectedKeys():返回所有已经准备就绪的SelectionKey 38. select(Selector selector, int numKeys):选择指定数量的已准备就绪的键集合,并将其复制到另一个Selector中 39. selectNow(Selector selector):立即返回准备就绪的键集合,不阻塞,并将其复制到另一个Selector中 40. select(long timeout, Selector selector):在指定时间内选择已准备就绪的键集合,并将其复制到另一个Selector中 41. selectNow(Selector selector, long timeout):在指定时间内选择已准备就绪的键集合,并将其复制到另一个Selector中 42. selectedKeys().toArray():将所有已准备就绪的SelectionKey放入数组中 43. select(int numKeys, Selector selector):选择指定数量的已准备就绪的键集合,并将其复制到另一个Selector中 44. select(long timeout, Selector selector, int numKeys):在指定时间内选择指定数量的已准备就绪的键集合,并将其复制到另一个Selector中 45. select(Selector selector, long timeout, int numKeys):在指定时间内选择指定数量的已准备就绪的键集合,并将其复制到另一个Selector中 46. selectNow(Selector selector, int numKeys):立即返回指定数量的已准备就绪的键集合,不阻塞,并将其复制到另一个Selector中 47. close(SelectionKey key):关闭一个SelectionKey 48. isRegistered():判断当前SelectionKey是否已经注册 49. cancel():注销当前SelectionKey 50. interestOps(int ops):设置Selector监视的当前通道的事件集合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值