过去推荐过两篇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上篇的新回复中已经有人提到。
分享到:
相关推荐
playwright-query-selector-all方法详解
浅谈android的selector背景选择器
Selector
Flutter的file_selector插件可以帮助开发者在移动应用中方便地选择文件。 要使用file_selector插件,首先需要将插件的依赖项添加到pubspec.yaml文件中,并运行flutter pub get命令获取插件的最新版本。 在插件使用...
一个强大的selector注入器,它可以让view自动产生selector状态,免去了你写selector的麻烦。
如果Selector正处于阻塞状态,`selector.wakeup()`方法可以用来中断阻塞并让其重新检查通道。这在需要立即处理新注册事件时非常有用。例如,当线程B注册了一个写事件,线程A需要被唤醒以便在下一次`select()`调用中...
在simulink上进行BusCreator和BusSelector的简单实验
Android selector 完整demo
selenium css selector 定位详解
带圆角的selector
CSS Selector 生成器
《Contact Selector控件在InfoPath中的应用》 在InfoPath设计复杂的表单时,Contact Selector控件是一个不可或缺的工具,它允许用户从SharePoint的人力资源列表或Outlook联系人中选择并插入联系人信息。这个功能...
selectorgadget插件,R语言爬取网页
java selector 测试并发.多线程并发。
Laravel开发-selector 选择器模式抽象类,用于管理用户级或运行时参数上的多态性。
代码实现drawable的selector效果,不用为每个控件写selector样式; 另外,实现圆形图片处理、圆角图片处理功能
一个关于SocketChannel、ServerSocketChannel、Selector的综合案例
ListView Button ImageView 里应用selector选择器切换图片并保持住
Android selector demo例子 文章:http://blog.csdn.net/u012524598/article/details/21410711
开发过程中使用阿里巴巴的iconfont来减小apk大小,这是做的一个Demo,里面可以用来实现selector的状态改变,非常好用的,希望对感兴趣的朋友有帮助。