﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-yeshucheng-随笔分类-NIO学习</title><link>http://www.blogjava.net/yeshucheng/category/37614.html</link><description>追逐自己，追逐方向，心随悟所动</description><language>zh-cn</language><lastBuildDate>Sun, 12 Dec 2010 13:43:23 GMT</lastBuildDate><pubDate>Sun, 12 Dec 2010 13:43:23 GMT</pubDate><ttl>60</ttl><item><title>Future的一个简单实例</title><link>http://www.blogjava.net/yeshucheng/archive/2010/12/10/340298.html</link><dc:creator>叶澍成</dc:creator><author>叶澍成</author><pubDate>Fri, 10 Dec 2010 12:53:00 GMT</pubDate><guid>http://www.blogjava.net/yeshucheng/archive/2010/12/10/340298.html</guid><description><![CDATA[<p>
</p>
<p>个人账户类：</p>
<p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;PrivateAccount&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Callable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;total;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Object&nbsp;call()&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000; ">5</span><span style="color: #000000; ">*</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Integer(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Random().nextInt(</span><span style="color: #000000; ">10000</span><span style="color: #000000; ">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">您个人账户上还有</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">total</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;存款可以支配</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;total;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
</p>
<p>
</p>
<p>主函数测试：</p>
<p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;SumTest&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;ExecutionException&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;InterruptedException&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;InterruptedException,&nbsp;ExecutionException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callable&nbsp;privateAccount</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;PrivateAccount();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FutureTask&nbsp;task</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FutureTask(privateAccount);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">创建新线程获取个人账户信息</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;thread</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Thread(task);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.start();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;total</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Random().nextInt(</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">主线程在这工作<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">您目前操作金额为：&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">total</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">请等待计算个人账户的金额<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">task.isDone()){</span><span style="color: #008000; ">//</span><span style="color: #008000; ">判断是否已经获取返回值</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">*</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;privateSingle</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(Integer)task.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;post</span><span style="color: #000000; ">=</span><span style="color: #000000; ">privateSingle.intValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">您当前账户共有金额为:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">(total</span><span style="color: #000000; ">+</span><span style="color: #000000; ">post)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;￥</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
</p>
<div><br />
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/yeshucheng/aggbug/340298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yeshucheng/" target="_blank">叶澍成</a> 2010-12-10 20:53 <a href="http://www.blogjava.net/yeshucheng/archive/2010/12/10/340298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>认识缓冲区Buffer</title><link>http://www.blogjava.net/yeshucheng/archive/2009/02/13/254603.html</link><dc:creator>叶澍成</dc:creator><author>叶澍成</author><pubDate>Fri, 13 Feb 2009 12:56:00 GMT</pubDate><guid>http://www.blogjava.net/yeshucheng/archive/2009/02/13/254603.html</guid><wfw:comment>http://www.blogjava.net/yeshucheng/comments/254603.html</wfw:comment><comments>http://www.blogjava.net/yeshucheng/archive/2009/02/13/254603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yeshucheng/comments/commentRss/254603.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yeshucheng/services/trackbacks/254603.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-indent: 21pt"><span style="font-family: 宋体">数据对于输入和输出的操作耗时是非常严重的问题，如果把这个问题放入到网络上去看待更甚是值得注意的一个问题了。假如结合基础的</span>OS<span style="font-family: 宋体">知识我们也知道如果要减少这种</span>I/O<span style="font-family: 宋体">操作的耗时或者也可以说提升这种效率的话，最大的可能就是减少物理读写的次数，而且尽可能做到主存数据的重读性（操作系统也在加强说明更多减少抖动现象的产生）。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在</span>java.nio<span style="font-family: 宋体">包中我们可以直接来操作相对应的</span>API<span style="font-family: 宋体">了。可以让</span>java<span style="font-family: 宋体">更加方便的直接控制和运用缓冲区。缓冲区有几个需要了解的特定概念需要详尽来解释，才能更好的知道我们下面一些列需要针对的问题实质。</span></p>
<h3><span style="font-family: 宋体">属性</span></h3>
<p><span style="font-family: 宋体">容量（</span>capacity<span style="font-family: 宋体">）：顾名思义就是表示缓冲区中可以保存多少数据；</span></p>
<p><span style="font-family: 宋体">极限（</span>limit<span style="font-family: 宋体">）：缓冲区中的当前数据终结点。不过它是可以动态改变的，这样做的好处也是充分利用重用性；</span></p>
<p><span style="font-family: 宋体">位置</span>(position)<span style="font-family: 宋体">：这个也好理解，其实就是指明下一个需要读写数据的位置。</span></p>
<p><span style="font-family: 宋体">上面上个关系还可以具体用图示的方式来表达整体概念，如下图所示：<br />
</span></p>
<span style="font-family: 宋体">
<p align="left">
<div align="center"><img height="163" alt="" src="http://www.blogjava.net/images/blogjava_net/yeshucheng/buffer.jpg" width="151" border="0" /></div>
<br />
在极限的时候就说到可以<em>修改</em>它，所以对于它的操作由以下方法：</span></p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>clear()<span style="font-family: 宋体">：首先把极限设置为容量，再者就是需要把位置设置为</span>0<span style="font-family: 宋体">；</span></p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>flip()<span style="font-family: 宋体">：把极限设置为位置区，再者就是需要把位置设置为</span>0<span style="font-family: 宋体">；</span></p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>rewind()<span style="font-family: 宋体">：不改变极限，不过还是需要把位置设置为</span>0<span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">最为最基础的缓冲区</span>ByteBuffer<span style="font-family: 宋体">，它存放的数据单元是字节。首先要强调的是</span>ByteBuffer<span style="font-family: 宋体">没有提供公开的构造方法，只是提供了两个静态的工厂方法。</span></p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>allocate(int capacity)<span style="font-family: 宋体">：返回一个</span>ByteBuffer<span style="font-family: 宋体">对象，参数表示缓冲区容量大小。</span></p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>allocateDirect (int capacity)<span style="font-family: 宋体">：返回一个</span>ByteBuffer<span style="font-family: 宋体">对象，参数也是一样表示缓冲区容量大小。</span></p>
<p><span style="font-family: 宋体">在这里需要注意的是在使用两者的时候需要特别小心，</span>allocateDirect<span style="font-family: 宋体">和当前操作系统联系的非常紧密，它牵涉到使用</span>native method<span style="font-family: 宋体">的方法，大家知道一旦本地方法就是需要考虑调用</span>dll<span style="font-family: 宋体">（动态链接库）这个时候基本也就失去了</span>JAVA<span style="font-family: 宋体">语言的特性，言外之意对于耗资源非常大。所以如果考虑到当前使用的缓存区比较庞大而且是一个长期驻留使用的，这个时候可以考虑使用它。</span></p>
 <img src ="http://www.blogjava.net/yeshucheng/aggbug/254603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yeshucheng/" target="_blank">叶澍成</a> 2009-02-13 20:56 <a href="http://www.blogjava.net/yeshucheng/archive/2009/02/13/254603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>