过去推荐过两篇blog《Java NIO类库Selector机制解析》(上
,下
),感叹java为了跨平台似乎“很傻很天真”。最近学习使用ACE,才知道这个解决办法倒不是java开创的,ACE也是这样搞的。java nio中Selector的wakeup方法,类似于ACE_Select_Reactor的notify机制,可以从非select调用的线程去唤醒阻塞在select调用上的select线程,当然ACE_Select_Reactor的notify强大多了,可以实现event handler的无限扩容。ACE_Select_Reactor的notify的实现是通过ACE_Pipe,在ACE_Pipe中可以清晰地看到针对win32平台是采用了TCP连接:
<!---->#if
defined (ACE_LACKS_SOCKETPAIR) || defined (__Lynx__)
ACE_INET_Addr my_addr;
ACE_SOCK_Acceptor acceptor;
ACE_SOCK_Connector connector;
ACE_SOCK_Stream reader;
ACE_SOCK_Stream writer;
int
result
=
0
;
#
if
defined (ACE_WIN32)
ACE_INET_Addr local_any (static_cast
<
u_short
>
(
0
), ACE_LOCALHOST);
#
else
ACE_Addr local_any
=
ACE_Addr::sap_any;
# endif
/*
ACE_WIN32
*/
//
Bind listener to any port and then find out what the port was.
if
(acceptor.open (local_any)
==
-
1
||
acceptor.get_local_addr (my_addr)
==
-
1
)
result
=
-
1
;
else
{
ACE_INET_Addr sv_addr (my_addr.get_port_number (),
ACE_LOCALHOST);
//
Establish a connection within the same process.
if
(connector.connect (writer, sv_addr)
==
-
1
)
result
=
-
1
;
else
if
(acceptor.accept (reader)
==
-
1
)
{
writer.close ();
result
=
-
1
;
}
}
//
Close down the acceptor endpoint since we don't need it anymore.
acceptor.close ();
在类unix平台是采用STREAMS管道,在一些遗留的unix平台上是socketpair()。为什么在win32上采用TCP连接的方式呢?原因不是什么性能、资源问题,也不是因为windows管道消耗的资源比tcp多,而是由于winsock的select函数(java nio的select在win32下是使用select实现的)是无法监测管道事件的,也就是说无法将windows管道加入到fd_set中,为了做到可移植,才在win32上采用了TCP连接的方式来实现。这一点在blog上篇的新回复中已经有人提到。
分享到:
相关推荐
如果Selector正处于阻塞状态,`selector.wakeup()`方法可以用来中断阻塞并让其重新检查通道。这在需要立即处理新注册事件时非常有用。例如,当线程B注册了一个写事件,线程A需要被唤醒以便在下一次`select()`调用中...
本文主要介绍了Java NIO中几个容易被忽视但又非常重要的知识点:`Selector`的`wakeup()`原理、`Channel`的关闭行为以及`begin()`和`end()`方法对的作用。通过深入理解这些细节,可以帮助开发者更好地掌握Java NIO...
- **SelectionKey**:表示Channel和Selector之间的注册关系,记录了Channel的可读、可写等状态,并提供wakeup方法唤醒Selector。 - **Pipe**:在NIO中提供了单向数据管道,可以从source通道写入,从sink通道读出。...
- **Buffer**: 缓冲区是 NIO 中数据存储的基本单元,数据从 Channel 读入缓冲区,再从缓冲区写入 Channel。Buffer 提供了多种操作方法,如 `flip`、`clear` 和 `rewind`。`flip` 用于切换读写模式,`clear` 清空缓冲...
Netty是一个高性能、异步事件驱动的网络应用框架,专为Java设计,用于构建高效...Selector的register方法用于向选择器注册通道并设置监听事件,SelectionKey代表了注册关系,wakeup方法用于唤醒被阻塞的Selector线程。
//selector的wakeup方法被调用,方法返回,而对于客户端来说,通道一直是被选中的 selector.select(); // 获得selector中选中的项的迭代器 Iterator ite = this.selector.selectedKeys().iterator(); while...
Selector 的关键操作包括 open、register 和 wakeup 等,其中 register 方法允许将 Channel 注册到 Selector,并指定关注的事件类型。 综上所述,Netty 作为一款强大的网络通信框架,因其高性能、易用性和高度可...
在`Selector`中,中断会导致线程立即从选择操作返回,就像调用了`Selector.wakeup()`一样。 检测中断通常有两种方式。第一种是在可能会抛出`InterruptedException`的方法中捕获异常,这通常意味着线程应该终止。另...
对于基于Selector的异步I/O,可以调用`Selector.wakeup()`;对于内部锁,可以使用`Lock`接口提供的`tryLock()`或`unlock()`方法。 4. **恢复中断状态**:有时在处理`InterruptedException`后,为了保持中断状态,...
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); ``` 2. 日程安排 在日程管理应用中,TimePickerView可以帮助用户设定活动开始和结束时间,然后将这些时间信息存储到...
5. **中断和唤醒(Interrupt and Wakeup)**:NIO支持中断IO操作,当操作被中断时,系统会立即停止等待并抛出异常,使得线程可以更快地响应其他事件。 6. **文件系统操作的增强**:NIO还提供了一些高级文件系统功能...