??xml version="1.0" encoding="utf-8" standalone="yes"?>91涩漫在线观看,日韩精品久久久免费观看,97久久超碰福利国产精品…http://www.aygfsteel.com/nkjava/category/36597.html|n瀚的沙漠Q方向最为重要,希望此blog能向大漠驼铃一Pl我方向和指引?lt;br/> Java,Php,Shell,Python,服务器运l?大数据,SEO, |站开发、运l?云服务技术支持,IM服务供应? FreeSwitch搭徏Q技术支持等. 技术讨论QQ:428622099zh-cnMon, 29 Aug 2016 19:27:25 GMTMon, 29 Aug 2016 19:27:25 GMT60Tomcat7.0修改内存的配|(如何讄Tomcat的堆内存Q?/title><link>http://www.aygfsteel.com/nkjava/archive/2016/08/29/431692.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Mon, 29 Aug 2016 05:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2016/08/29/431692.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/431692.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2016/08/29/431692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/431692.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/431692.html</trackback:ping><description><![CDATA[Windows环境下在Tomcat/bin目录下创建setenv.bat, Linux环境下在Tomcat/bin目录下设|setenv.sh<br />注意只是后缀名称不同Qؓ什么不同,注意查看catalina.bat或者catalina.sh?br /><br />例如setenv.sh里添加下面的内容<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->export JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=256m"</div>Windows下的setenv.bat里添加下面的内容Q?br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->set "JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx1024m -XX:MaxPermSize=256m -server"</div><br /><br />然后重启TomcatQ查看堆内存的用情况:<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->worker      15061     1  0 Aug25 ?        00:04:21 /usr/bin/java -Djava.util.logging.config.file=/home/work/apache-tomcat-7.0.53/conf/logging.properties -Djava.util.logging.manager=<span style="background-color: yellow;">org.apache.juli.ClassLoaderLogManager </span><span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">Dfile.encoding</span><span style="color: red; background-color: yellow;">=</span><span style="color: red; background-color: yellow;">UTF</span><span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">8</span> <span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">Xms2048m </span><span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">Xmx2048m </span><span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">XX:PermSize</span><span style="color: red; background-color: yellow;">=</span><span style="color: red; background-color: yellow;">256m </span><span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">XX:MaxPermSize</span><span style="color: red; background-color: yellow;">=</span><span style="color: red; background-color: yellow;">256m </span>-Djava.awt.headless=<span style="color: #0000FF; ">true</span> -Djava.endorsed.dirs=/home/work/apache-tomcat-7.0.53/endorsed -classpath /home/work/apache-tomcat-7.0.53/bin/bootstrap.jar:/home/work/apache-tomcat-7.0.53/bin/tomcat-juli.jar -Dcatalina.base=/home/work/apache-tomcat-7.0.53 -Dcatalina.home=/home/work/apache-tomcat-7.0.53 -Djava.io.tmpdir=/home/work/apache-tomcat-7.0.53/temp org.apache.catalina.startup.Bootstrap start</div><div><br />说明讄成功Q很单?br /><br />后箋我会写几Tomcat内存学习的文章,Ƣ迎大家x?br /><br /></div><img src ="http://www.aygfsteel.com/nkjava/aggbug/431692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2016-08-29 13:55 <a href="http://www.aygfsteel.com/nkjava/archive/2016/08/29/431692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>To prevent a memory leak, the JDBC Driver has been forcibly unregistered--有关Tomcat自动宕机的解x?/title><link>http://www.aygfsteel.com/nkjava/archive/2016/08/03/431436.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Wed, 03 Aug 2016 02:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2016/08/03/431436.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/431436.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2016/08/03/431436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/431436.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/431436.html</trackback:ping><description><![CDATA[最q有几个服务的TomcatL无缘无故的宕机,C不得不解决的地步?br /> 在Stackoverflow上找到比较有用的一文章,解决Ҏ如下Q?br /> <div><a >http://stackoverflow.com/questions/3320400/to-prevent-a-memory-leak-the-jdbc-driver-has-been-forcibly-unregistered<br /> 有以下几个解决途径Q?br /> </a> <ol style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; font-size: 15px; color: #242729; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; line-height: 19.5px; background-color: #ffffff;"> <li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;"> <p style="margin: 0px; padding: 0px; border: 0px; clear: both;">Ignore those warnings. Tomcat is doing its job right. The actual bug is in someone else's code (the JDBC driver in question), not in yours. Be happy that Tomcat did its job properly and wait until the JDBC driver vendor get it fixed so that you can upgrade the driver. On the other hand, you aren't supposed to drop a JDBC driver in webapp's <code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">/WEB-INF/lib</code>, but only in server's <code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">/lib</code>. If you still keep it in webapp's <code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">/WEB-INF/lib</code>, then you should manually register and deregister it using a <code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">ServletContextListener</code>.<br /> 忽略警告。把WEB-INF/lib下的mysql驱动文g拯到Tomcat/lib下。如果仍然要攑֜WEB-INF/lib下,需要用监听器手动的注册和注销?br /> 下面的文章介l如何写监听器,<a >http://javabeat.net/servletcontextlistener-example/Q?当然如果是Servlet3.0Q?使用注解方式讄监听也是可以的?br /> 下面的代码是如何注销?br /> <br /> </a></p> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 /> --><strong><span style="color: #000000; ">Step </span><span style="color: #000000; ">1</span></strong><span style="color: #000000; "><strong>: Register a Listener</strong><br /> web.xml<br /> </span><span style="color: #000000; "><</span><span style="color: #000000; ">listener</span><span style="color: #000000; ">></span><span style="color: #000000; "><br />     </span><span style="color: #000000; "><</span><span style="color: #000000; ">listener</span><span style="color: #000000; ">-</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">></span><span style="color: #000000; ">com.mysite.MySpecialListener</span><span style="color: #000000; "></</span><span style="color: #000000; ">listener</span><span style="color: #000000; ">-</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /> </span><span style="color: #000000; "></</span><span style="color: #000000; ">listener</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /> <strong>Step </strong></span><span style="color: #000000; "><strong>2</strong></span><span style="color: #000000; "><strong>: Implement the Listener</strong><br /> <br /> com.mysite.MySpecialListener.java<br /> <br /> </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> MySpecialListener </span><span style="color: #0000FF; ">extends</span><span style="color: #000000; "> ApplicationContextListener {<br /> <br />     @Override<br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> contextInitialized(ServletContextEvent sce) {<br />         </span><span style="color: #008000; ">//</span><span style="color: #008000; "> On Application Startup, please…<br /> <br />         </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Usually I'll make a singleton in here, set up my pool, etc.</span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">    }<br /> <br />     @Override<br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> contextDestroyed(ServletContextEvent sce) {<br />       </span><span style="color: #000000; "><span style="font-family: verdana, "courier new"; line-height: 21px; color: #008000;">//</span><span style="font-family: verdana, "courier new"; line-height: 21px; color: #008000;"> This manually deregisters JDBC driver, which prevents Tomcat 7 from complaining about memory leaks wrto this class</span><span style="font-family: verdana, "courier new"; line-height: 21px; color: #008000;"><br /> </span><span style="font-family: verdana, "courier new"; line-height: 21px;">        Enumeration</span><span style="font-family: verdana, "courier new"; line-height: 21px;"><</span><span style="font-family: verdana, "courier new"; line-height: 21px;">Driver</span><span style="font-family: verdana, "courier new"; line-height: 21px;">></span><span style="font-family: verdana, "courier new"; line-height: 21px;"> drivers </span><span style="font-family: verdana, "courier new"; line-height: 21px;">=</span><span style="font-family: verdana, "courier new"; line-height: 21px;"> DriverManager.getDrivers();</span><br style="font-family: verdana, "courier new"; line-height: 21px;" /> <span style="font-family: verdana, "courier new"; line-height: 21px;">        </span><span style="font-family: verdana, "courier new"; line-height: 21px; color: #0000ff;">while</span><span style="font-family: verdana, "courier new"; line-height: 21px;"> (drivers.hasMoreElements()) {</span><br style="font-family: verdana, "courier new"; line-height: 21px;" /> <span style="font-family: verdana, "courier new"; line-height: 21px;">            Driver driver </span><span style="font-family: verdana, "courier new"; line-height: 21px;">=</span><span style="font-family: verdana, "courier new"; line-height: 21px;"> drivers.nextElement();</span><br style="font-family: verdana, "courier new"; line-height: 21px;" /> <span style="font-family: verdana, "courier new"; line-height: 21px;">            </span><span style="font-family: verdana, "courier new"; line-height: 21px; color: #0000ff;">try</span><span style="font-family: verdana, "courier new"; line-height: 21px;"> {</span><br style="font-family: verdana, "courier new"; line-height: 21px;" /> <span style="font-family: verdana, "courier new"; line-height: 21px;">                DriverManager.deregisterDriver(driver);</span><br style="font-family: verdana, "courier new"; line-height: 21px;" /> <span style="font-family: verdana, "courier new"; line-height: 21px;">                LOG.log(Level.INFO, String.format(</span><span style="font-family: verdana, "courier new"; line-height: 21px;">"</span><span style="font-family: verdana, "courier new"; line-height: 21px;">deregistering jdbc driver: %s</span><span style="font-family: verdana, "courier new"; line-height: 21px;">"</span><span style="font-family: verdana, "courier new"; line-height: 21px;">, driver));</span><br style="font-family: verdana, "courier new"; line-height: 21px;" /> <span style="font-family: verdana, "courier new"; line-height: 21px;">            } </span><span style="font-family: verdana, "courier new"; line-height: 21px; color: #0000ff;">catch</span><span style="font-family: verdana, "courier new"; line-height: 21px;"> (SQLException e) {</span><br style="font-family: verdana, "courier new"; line-height: 21px;" /> <span style="font-family: verdana, "courier new"; line-height: 21px;">                LOG.log(Level.SEVERE, String.format(</span><span style="font-family: verdana, "courier new"; line-height: 21px;">"</span><span style="font-family: verdana, "courier new"; line-height: 21px;">Error deregistering driver %s</span><span style="font-family: verdana, "courier new"; line-height: 21px;">"</span><span style="font-family: verdana, "courier new"; line-height: 21px;">, driver), e);</span><br style="font-family: verdana, "courier new"; line-height: 21px;" /> <span style="font-family: verdana, "courier new"; line-height: 21px;">            }</span><br style="font-family: verdana, "courier new"; line-height: 21px;" /> <br style="font-family: verdana, "courier new"; line-height: 21px;" /> <span style="font-family: verdana, "courier new"; line-height: 21px;">        }</span><br />     }<br /> <br /> }</span></div> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"></div> </li> <li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;"> <p style="margin: 0px; padding: 0px; border: 0px; clear: both;">Downgrade to Tomcat 6.0.23 or older so that you will not be bothered with those warnings. But it will silently keep leaking memory. Not sure if that's good to know after all. Those kind of memory leaks are one of the major causes behind <a style="margin: 0px; padding: 0px; border: 0px; color: #005999; text-decoration: none; cursor: pointer;"><code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">OutOfMemoryError</code> issues</a> during Tomcat hotdeployments.<br /> 把Tomcat降C版本Q?.0.23以下Q,虽然不会报错Q但是还是存在内存益出的问题Q这q不是一个好的解x案?br /> <br /> </p> </li> <li style="margin: 0px; padding: 0px; border: 0px; word-wrap: break-word;"> <p style="margin: 0px; padding: 0px; border: 0px; clear: both;">Move the JDBC driver to Tomcat's <code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">/lib</code> folder and have a connection pooled datasource to manage the driver. Note that Tomcat's builtin DBCP does not deregister drivers properly on close. See also bug <a style="margin: 0px; padding: 0px; border: 0px; color: #005999; text-decoration: none; cursor: pointer;">DBCP-322</a> which is closed as WONTFIX. You would rather like to replace DBCP by another connection pool which is doing its job better then DBCP. For example<a style="margin: 0px; padding: 0px; border: 0px; color: #005999; text-decoration: none; cursor: pointer;">HikariCP</a>, <a style="margin: 0px; padding: 0px; border: 0px; color: #005999; text-decoration: none; cursor: pointer;">BoneCP</a>, or perhaps <a style="margin: 0px; padding: 0px; border: 0px; color: #005999; text-decoration: none; cursor: pointer;">Tomcat JDBC Pool</a>.<br /> 把驱动文件移到Tomcat/lib文g夹下Q不用用DBCPQ用以下的q接池库,HikariCP, BoneCP,或者Tomcat JDBC Pool.<br /><br /> </p> </li> <li>MAVEN目<br /> <p style="margin: 0px 0px 1em; padding: 0px; border: 0px; clear: both;">If you are getting this message from a Maven built war change the scope of the JDBC driver to provided, and put a copy of it in the lib directory. Like this:<span style="font-size: 13px; color: #000000;"><</span><span style="font-size: 13px; color: #000000;">dependency</span><span style="font-size: 13px; color: #000000;">>Q?br /> 对于MAVEN目Q由于Tomcat中存在mysql驱动文gQ?中介l)Q这样在部v时就不会把mysql带到打包文g里,注意?lt;scope>provided</scope>?br /> </span></p> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #000000; ">  </span><span style="color: #000000; "><</span><span style="color: #000000; ">groupId</span><span style="color: #000000; ">></span><span style="color: #000000; ">mysql</span><span style="color: #000000; "></</span><span style="color: #000000; ">groupId</span><span style="color: #000000; ">></span><span style="color: #000000; "><br />   </span><span style="color: #000000; "><</span><span style="color: #000000; ">artifactId</span><span style="color: #000000; ">></span><span style="color: #000000; ">mysql</span><span style="color: #000000; ">-</span><span style="color: #000000; ">connector</span><span style="color: #000000; ">-</span><span style="color: #000000; ">java</span><span style="color: #000000; "></</span><span style="color: #000000; ">artifactId</span><span style="color: #000000; ">></span><span style="color: #000000; "><br />   </span><span style="color: #000000; "><</span><span style="color: #000000; ">version</span><span style="color: #000000; ">></span><span style="color: #000000; ">5.1</span><span style="color: #000000; ">.</span><span style="color: #000000; ">18</span><span style="color: #000000; "></</span><span style="color: #000000; ">version</span><span style="color: #000000; ">></span><span style="color: #000000; "><br />   </span><span style="color: #000000; "><!--</span><span style="color: #000000; "> put a copy in </span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">share</span><span style="color: #000000; ">/</span><span style="color: #000000; ">tomcat7</span><span style="color: #000000; ">/</span><span style="color: #000000; ">lib </span><span style="color: #000000; ">--></span><span style="color: #000000; "><br />   </span><span style="color: #000000; "><</span><span style="color: #000000; ">scope</span><span style="color: #000000; ">></span><span style="color: #000000; ">provided</span><span style="color: #000000; "></</span><span style="color: #000000; ">scope</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /> </span><span style="color: #000000; "></</span><span style="color: #000000; ">dependency</span><span style="color: #000000; ">></span></div> </li> </ol> </div> 好了Q如果您遇到同样的问题,可以和我沟通,联系方式见头部?img src ="http://www.aygfsteel.com/nkjava/aggbug/431436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2016-08-03 10:59 <a href="http://www.aygfsteel.com/nkjava/archive/2016/08/03/431436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA Iterator 转成 Listhttp://www.aygfsteel.com/nkjava/archive/2014/11/29/420850.html草原上的骆驼草原上的骆驼Sat, 29 Nov 2014 10:26:00 GMThttp://www.aygfsteel.com/nkjava/archive/2014/11/29/420850.htmlhttp://www.aygfsteel.com/nkjava/comments/420850.htmlhttp://www.aygfsteel.com/nkjava/archive/2014/11/29/420850.html#Feedback2http://www.aygfsteel.com/nkjava/comments/commentRss/420850.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/420850.html 1.使用Apache Common Collections
2.自己实现的方法{?br />3.Guaa实现转换



方式1Q?br /> #Apache Commons Collections:
import org.apache.commons.collections.IteratorUtils;
Iterator<Element> myIterator = //some iterator
List<Element> myList=IteratorUtils.toList(myIterator);   


方式二:
或者自p{?br /> public static <T> List<T> copyIterator(Iterator<T> iter) {
    List<T> copy = new ArrayList<T>();
    while (iter.hasNext())
        copy.add(iter.next());
    return copy;
}

使用方式Q?br /> List<String> list = Arrays.asList("1", "2", "3");
Iterator<String> iter = list.iterator();
List<String> copy = copyIterator(iter);

方式3Q?br /> #Guava
import com.google.common.collect.Lists;
Iterator<Element> myIterator =  //some iterator
List<Element> myList = Lists.newArrayList(myIterator);


草原上的骆驼 2014-11-29 18:26 发表评论
]]>
MAVEN安装代码到本地库Q安装jar, source, javadoc的方?/title><link>http://www.aygfsteel.com/nkjava/archive/2014/07/09/415634.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Wed, 09 Jul 2014 09:25:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2014/07/09/415634.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/415634.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2014/07/09/415634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/415634.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/415634.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->mvn install:install-file -Dfile=D:/spymemcached-2.10.3.jar -DgroupId=net.spy -DartifactId=spymemcached -Dversion=2.10.3 -Dpackaging=jar<br />mvn install:install-file -Dfile=D:/spymemcached-2.10.3-sources.jar -DgroupId=net.spy -DartifactId=spymemcached -Dversion=2.10.3 -Dpackaging=jar -Dclassifier=sources<br />mvn install:install-file -Dfile=D:/spymemcached-2.10.3-javadoc.jar -DgroupId=net.spy -DartifactId=spymemcached -Dversion=2.10.3 -Dpackaging=jar -Dclassifier=javadoc</div><img src ="http://www.aygfsteel.com/nkjava/aggbug/415634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2014-07-09 17:25 <a href="http://www.aygfsteel.com/nkjava/archive/2014/07/09/415634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM学习??/title><link>http://www.aygfsteel.com/nkjava/archive/2012/03/15/371971.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 15 Mar 2012 11:39:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2012/03/15/371971.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/371971.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2012/03/15/371971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/371971.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/371971.html</trackback:ping><description><![CDATA[<div> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span>JVM</span></span><span style="font-size:9.0pt;color:#333333">栈解决程序的q行问题Q即E序如何执行Q或者说如何处理数据</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">;JVM</span><span style="font-size:9.0pt;color:#333333">堆解决的是数据存储的问题Q即数据怎么放、放在哪儿,另外</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中存的是对象?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中存的是基本数据类型和</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中对象的引用?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">基础概念Q?/span></strong><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">堆与</span></strong><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">?/span></strong></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size: 9.0pt;font-family:宋体;color:#333333">数据cd</span></strong></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:"Arial","sans-serif";color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">虚拟ZQ数据类型可以分Zc:基本cd和引用类型。基本类型的变量保存原始|卻I他代表的值就是数值本w?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">;</span><span style="font-size:9.0pt;color:#333333">而引用类型的变量保存引用倹{?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">“</span><span style="font-size:9.0pt;color:#333333">引用?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">”</span><span style="font-size:9.0pt;color:#333333">代表了某个对象的引用Q而不是对象本w,对象本n存放在这个引用值所表示的地址的位|?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">基本cd包括Q?/span><span style="font-size:9.0pt; font-family:"Arial","sans-serif";color:#333333">byte,short,int,long,char,float,double,Boolean,returnAddress</span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">引用cd包括Q类cdQ接口类型和数组?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">堆与</span></strong><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">?/span></strong></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆和</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈是E序q行的关键,很有必要把他们的关系说清楚?br /> </span></p> <div> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈是q行时的单位Q?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆是存储的单位?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈解决程序的q行问题Q即E序如何执行Q或者说如何处理数据</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">;JVM</span><span style="font-size:9.0pt;color:#333333">堆解决的是数据存储的问题Q即数据怎么放、放在哪ѝ?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">?/span><span style="font-size:9.0pt; font-family:"Arial","sans-serif";color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">中一个线E就会相应有一个线E?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈与之对应,q点很容易理解,因ؓ不同的线E执行逻辑有所不同Q因此需要一个独立的U程</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈。?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆则是所有线E共享的?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈因为是q行单位Q因此里面存储的信息都是跟当前线E?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">(</span><span style="font-size:9.0pt;color:#333333">或程?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">)</span><span style="font-size:9.0pt;color:#333333">相关信息的。包括局部变量、程序运行状态、方法返回值等{?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">;</span><span style="font-size:9.0pt;color:#333333">?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆只负责存储对象信息?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size: 9.0pt;font-family:宋体;color:#333333">Z么要?/span></strong><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">堆和</span></strong><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">栈区分出来呢</span></strong><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">?JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">栈中不是也可以存储数据吗</span></strong><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">?</span></strong></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">W一Q从软g设计的角度看Q?/span><span style="font-size: 9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈代表了处理逻辑Q?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆代表了数据。这样分开Q得处理逻辑更ؓ清晰。分而治之的思想。这U隔R模块化的思想在Y件设计的Ҏ面面都有体现?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">W二Q?/span><span style="font-size:9.0pt; font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆与</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈的分离Q?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的内容可以被多个</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈共?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">(</span><span style="font-size:9.0pt;color:#333333">也可以理解ؓ多个U程讉K同一个对?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">)</span><span style="font-size:9.0pt;color:#333333">。这U共享的收益是很多的。一斚wq种׃n提供了一U有效的数据交互方式</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">(</span><span style="font-size:9.0pt;color:#333333">如:׃n内存</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">)</span><span style="font-size:9.0pt;color:#333333">Q另一斚wQ?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的共享常量和~存可以被所?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈访问,节省了空间?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">W三Q?/span><span style="font-size:9.0pt; font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈因行时的需要,比如保存pȝq行的上下文Q需要进行地址D늚划分。由?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈只能向上增长,因此׃限制?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈存储内容的能力。?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆不同,</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的对象是可以Ҏ需要动态增长的Q因?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈和</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆的拆分Q得动态增长成为可能,相应</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中只需记录</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的一个地址卛_?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">W四Q面向对象就?/span><span style="font-size:9.0pt; font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆和</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈的完美l合。其实,面向对象方式的程序与以前l构化的E序在执行上没有M区别。但是,面向对象的引入,使得对待问题的思考方式发生了改变Q而更接近于自然方式的思考。当我们把对象拆开Q你会发玎ͼ对象的属性其实就是数据,存放?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">;</span><span style="font-size:9.0pt;color:#333333">而对象的行ؓ</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">(</span><span style="font-size:9.0pt;color:#333333">Ҏ</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">)</span><span style="font-size:9.0pt;color:#333333">Q就是运行逻辑Q放?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中。我们在~写对象的时候,其实即编写了数据l构Q也~写的处理数据的逻辑。不得不承认Q面向对象的设计Q确实很?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">堆中存什?/span></strong><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">?JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">栈中存什?/span></strong><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">?</span></strong></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中存的是对象?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中存的是基本数据类型和</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中对象的引用。一个对象的大小是不可估计的Q或者说是可以动态变化的Q但是在</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中Q一个对象只对应了一?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">4btye</span><span style="font-size:9.0pt;color:#333333">的引?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">(JVM</span><span style="font-size:9.0pt;color:#333333">?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈分ȝ好处Q?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">))</span><span style="font-size:9.0pt;color:#333333">?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">Z么不把基本类型放</span><span style="font-size:9.0pt; font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">?</span><span style="font-size:9.0pt;color:#333333">因ؓ其占用的I间一般是</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">1~8</span><span style="font-size:9.0pt;color:#333333">个字?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">——</span><span style="font-size:9.0pt;color:#333333">需要空间比较少Q而且因ؓ是基本类型,所以不会出现动态增长的情况</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">——</span><span style="font-size:9.0pt;color:#333333">长度固定Q因?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中存储够了,如果把他存在</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中是没有什么意义的</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">(</span><span style="font-size:9.0pt;color:#333333">q会费I间Q后面说?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">)</span><span style="font-size:9.0pt;color:#333333">。可以这么说Q基本类型和对象的引用都是存攑֜</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中Q而且都是几个字节的一个数Q因此在E序q行Ӟ他们的处理方式是l一的。但是基本类型、对象引用和对象本n有所区别了,因ؓ一个是</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中的数据一个是</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的数据。最常见的一个问题就是,</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">中参C递时的问题?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">Java</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">中的参数传递时传值呢</span></strong><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">?</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">q是传引?/span></strong><strong><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">?</span></strong></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">要说明这个问题,先要明确两点Q?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:"Arial","sans-serif";color:#333333">1.</span><span style="font-size:9.0pt;color:#333333">不要试图?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">C</span><span style="font-size:9.0pt;color:#333333">q行cLQ?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">中没有指针的概念</span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:"Arial","sans-serif";color:#333333">2.</span><span style="font-size:9.0pt;color:#333333">E序q行永远都是?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中q行的,因而参C递时Q只存在传递基本类型和对象引用的问题。不会直接传对象本n?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">明确以上两点后?/span><span style="font-size:9.0pt; font-family:"Arial","sans-serif";color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">在方法调用传递参数时Q因为没有指针,所以它都是q行传D?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">(</span><span style="font-size:9.0pt;color:#333333">q点可以参?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">C</span><span style="font-size:9.0pt;color:#333333">的传D?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">)</span><span style="font-size:9.0pt;color:#333333">。因此,很多书里面都?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">是进行传D用,q点没有问题Q而且也简化的</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">C</span><span style="font-size:9.0pt;color:#333333">中复杂性?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">但是传引用的错觉是如何造成的呢</span><span style="font-size: 9.0pt;font-family:"Arial","sans-serif";color:#333333">?</span><span style="font-size:9.0pt;color:#333333">在运?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中Q基本类型和引用的处理是一LQ都是传|所以,如果是传引用的方法调用,也同时可以理解ؓ</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">“</span><span style="font-size:9.0pt;color:#333333">传引用?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">”</span><span style="font-size:9.0pt;color:#333333">的传D用,卛_用的处理跟基本类型是完全一L。但是当q入被调用方法时Q被传递的q个引用的|被程序解?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">(</span><span style="font-size:9.0pt;color:#333333">或者查?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">)</span><span style="font-size:9.0pt;color:#333333">?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的对象,q个时候才对应到真正的对象。如果此时进行修改,修改的是引用对应的对象,而不是引用本w,卻I修改的是</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的数据。所以这个修Ҏ可以保持的了?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">对象Q从某种意义上说Q是由基本类型组成的。可以把一个对象看作ؓ一|Q对象的属性如果还是对象,则还是一颗树</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">(</span><span style="font-size:9.0pt;color:#333333">即非叶子节点</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">)</span><span style="font-size:9.0pt;color:#333333">Q基本类型则为树的叶子节炏V程序参C递时Q被传递的值本w都是不能进行修改的Q但是,如果q个值是一个非叶子节点</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">(</span><span style="font-size:9.0pt;color:#333333">即一个对象引?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">)</span><span style="font-size:9.0pt;color:#333333">Q则可以修改q个节点下面的所有内宏V?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆和</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中Q?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈是E序q行最Ҏ的东ѝ程序运行可以没?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆,但是不能没有</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈。?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆是?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈进行数据存储服务,说白?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆就是一块共享的内存。不q,正是因ؓ</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆和</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈的分离的思想Q才使得</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">的垃圑֛收成为可能?/span></p> <p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:"Arial","sans-serif";color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">中,</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈的大小通过</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">-Xss</span><span style="font-size:9.0pt;color:#333333">来设|,?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中存储数据比较多时Q需要适当调大q个|否则会出?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">java.lang.StackOverflowError</span><span style="font-size:9.0pt;color:#333333">异常。常见的出现q个异常的是无法q回的递归Q因为此?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中保存的信息都是方法返回的记录炏V?/span></p> <p align="left" style="text-align:left;text-indent:20.25pt;"><strong><span style="font-size:12.0pt; font-family:"Arial","sans-serif";color:black;">java</span></strong><strong><span style="font-size:12.0pt; font-family:宋体;color:black;">栈的l成元素</span></strong><strong><span style="font-size:12.0pt;font-family:"Arial","sans-serif";color:black;">——</span></strong><strong><span style="font-size: 12.0pt;font-family:宋体;color:black;">栈</span></strong></p> <p align="left" style="text-align:left;text-indent:20.25pt;"><span style="font-size:10.0pt;font-family:宋体;color:black;">栈׃部分l成Q?strong>局部变量区、操作数栈、数据?/strong>。局部变量区和操作数栈的大小要视对应的方法而定Q他们是按字长计的。但调用一个方法时Q它从类型信息中得到此方法局部变量区和操作数栈大,q据此分配栈内存Q然后压?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">Java</span><span style="font-size:10.0pt; font-family:宋体;color:black;">栈?/span></p> <p align="left" style="text-align:left;text-indent:20.25pt;"><strong><span style="font-size:10.0pt;font-family:宋体;color:black;">局部变量区</span></strong><strong><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">:</span></strong><span style="font-size:10.0pt;font-family:宋体;color:black;">局部变量区被组lؓ以一个字长ؓ单位、从</span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">0</span><span style="font-size:10.0pt; font-family:宋体;color:black;">开始计数的数组Q类型ؓ</span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">short</span><span style="font-size:10.0pt; font-family:宋体;color:black;">?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">byte</span><span style="font-size:10.0pt; font-family:宋体;color:black;">?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">char</span><span style="font-size:10.0pt; font-family:宋体;color:black;">的值在存入数组前要被{换成</span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">int</span><span style="font-size:10.0pt; font-family:宋体;color:black;">|?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">long</span><span style="font-size:10.0pt; font-family:宋体;color:black;">?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">double</span><span style="font-size:10.0pt; font-family:宋体;color:black;">在数l中占据q箋的两,在访问局部变量中?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">long</span><span style="font-size:10.0pt; font-family:宋体;color:black;">?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">double</span><span style="font-size:10.0pt; font-family:宋体;color:black;">Ӟ只需取出q箋两项的第一的索引值即?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">,</span><span style="font-size:10.0pt; font-family:宋体;color:black;">如某?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">long</span><span style="font-size:10.0pt; font-family:宋体;color:black;">值在局部变量区中占据的索引?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">3</span><span style="font-size:10.0pt; font-family:宋体;color:black;">?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">4</span><span style="font-size:10.0pt; font-family:宋体;color:black;">,取值时Q指令只需取烦引ؓ</span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">3</span><span style="font-size:10.0pt; font-family:宋体;color:black;">?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">long</span><span style="font-size:10.0pt; font-family:宋体;color:black;">值即可?/span></p> <p align="left" style="text-align:left;"><span style="font-size:8.0pt;font-family:"Arial","sans-serif";color:black;">         </span><span style="font-size:10.0pt;font-family:宋体;color:black;">说再多也没用Q下面就看个例子Q好让大家对局部变量区有更深刻的认识。这个图来着《深?/span><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">JVM</span><span style="font-size: 10pt; font-family: 宋体; color: black; ">》:<br /> </span></p> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #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; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> runClassMethod(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i,</span><span style="color: #0000FF; ">long</span><span style="color: #000000; "> l,</span><span style="color: #0000FF; ">float</span><span style="color: #000000; "> f,</span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> d,Object o,</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; "> b) {   <br />         </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;   <br />      }   <br />        <br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> runInstanceMethod(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; "> c,</span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> d,</span><span style="color: #0000FF; ">short</span><span style="color: #000000; "> s,</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; "> b) {   <br />         </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;   <br />      }  <br /> </span></div> <img src="http://www.aygfsteel.com/images/blogjava_net/nkjava/1.jpg" width="642" height="278" alt="" /><br /> <br /> <div> <p><strong><span style="font-family:"Arial","sans-serif"; color:red">runInstanceMethod</span></strong><span style="font-family:宋体;color:red">的局部变量区W一Ҏ?/span><strong><span style="font-family:"Arial","sans-serif";color:red">reference</span></strong><span style="font-family:宋体;color:red">Q引用)Q它指定的就是对象本w的引用Q也是我们常用?/span><strong><span style="font-family:"Arial","sans-serif";color:red">this,</span></strong><span style="font-family:宋体;color:red">但是?/span><span><span style="font-family:"Arial","sans-serif"; color:red">runClassMethod</span></span><span style="font-family:宋体;color:red">Ҏ中,没这个引用,那是因ؓ</span><span style="font-family:"Arial","sans-serif";color:red">runClassMethod</span><span style="font-family:宋体;color:red">是个静态方?/span><strong><span style="font-family:宋体;color:red">?/span></strong><strong></strong></p> <p><strong> </strong></p> <p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:宋体;color:black;">操作数栈</span></strong><span style="font-size:10.0pt;font-family: 宋体;color:black;">和局部变量区一P操作数栈也被l织成一个以字长为单位的数组。但和前者不同的是,它不是通过索引来访问的Q而是通过入栈和出栈来讉K的。可把操作数栈理解ؓ存储计算Ӟ临时数据的存储区域。下面我们通过一D늮短的E序片段外加一q图片来了解下操作数栈的作用?/span></p> <p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:宋体;color:black;">Int</span></strong> <span style="font-size:10.0pt;font-family:宋体; color:black;">a= 100;</span></p> <p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:宋体;color:black;">Int </span></strong><span style="font-size:10.0pt;font-family:宋体; color:black;">b = 98;</span></p> <p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">Int</span></strong> <span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black;">c = a+b;</span></p> </div> <img src="http://www.aygfsteel.com/images/blogjava_net/nkjava/2.jpg" width="627" height="286" alt="" /><br /> <div> <p><span><span style="font-family:宋体; color:black">从图中可以得出:操作数栈其实是个时数据存储区域,它是通过入栈和出栈来q行操作的?/span></span></p> <p><strong><span style="font-size:9.0pt;color:black">帧数据区</span></strong> <span style="font-size:9.0pt;color:black">除了局部变量区和操作数栈外Q?/span><span style="font-size:9.0pt; font-family:"Arial","sans-serif";color:black">java</span><span style="font-size:9.0pt;color:black">栈q需要一些数据来支持帔R池解析、正常方法返回以及异常派发机制。这些数据都保存?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:black">java</span><span style="font-size:9.0pt;color:black">栈的数据Z。当</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:black">JVM</span><span style="font-size:9.0pt;color:black">执行到需要常量池数据的指令时Q它都会通过帧数据区中指向常量池的指针来讉K它?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:black"> </span></p> <p><span style="font-size:9.0pt;color:black">除了处理帔R池解析外Q里的数据q要处理</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:black">java</span><span style="font-size:9.0pt;color:black">Ҏ的正常结束和异常l止。如果是通过</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:black">return</span><span style="font-size:9.0pt;color:black">正常l束Q则当前栈?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:black">Java</span><span style="font-size:9.0pt;color:black">栈中弹出Q恢复发赯用的Ҏ的栈。如果方法又q回|</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:black">JVM</span><span style="font-size:9.0pt;color:black">会把q回值压入到发v调用Ҏ的操作数栈?/span></p> <p><span style="font-size:9.0pt;color:black">Z处理</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:black">java</span><span style="font-size:9.0pt;color:black">Ҏ中的异常情况Q数据必须保存一个对此方法异常引用表的引用。当异常抛出Ӟ</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:black">JVM</span><span style="font-size:9.0pt;color:black">l?/span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:black">catch</span><span style="font-size:9.0pt;color:black">块中的代码。如果没发现Q方法立即终止,然后</span><span style="font-size:9.0pt;font-family:"Arial","sans-serif";color:black">JVM</span><span style="font-size:9.0pt;color:black">用区数据的信息恢复发v调用的方法的帧。然后再发v调用Ҏ的上下文重新抛出同样的异常?/span></p> </div> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #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; ">class</span><span style="color: #000000; "> Example3C{<br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> addAndPrint(){<br />         </span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> result </span><span style="color: #000000; ">=</span><span style="color: #000000; "> addTwoTypes(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">88.88</span><span style="color: #000000; ">);<br />         System.out.println(result);<br />     }<br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> addTwoTypes(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i, </span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> d){<br />     </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">d;<br />     }<br /> <br /> }</span></div> <img src="http://www.aygfsteel.com/images/blogjava_net/nkjava/4.jpg" width="561" height="418" alt="" /><br /> <div> <p><span style="font-size:10.0pt;font-family: "Arial","sans-serif";color:red">1.</span><span style="font-size:10.0pt;color:red">只有在调用一个方法时Q才为当前栈分配一个Q然后将该压入?/span></p> <p><span style="font-size:10.0pt;font-family: "Arial","sans-serif";color:red">2 </span><span style="font-size:10.0pt;color:red">帧中存储了对应方法的局部数据,Ҏ执行完,对应的则从栈中弹出Qƈ把返回结果存储在<strong><span style="font-family:宋体;">调用</span></strong></span><strong> </strong><strong><span style="font-size:10.0pt;font-family:宋体;color:red">Ҏ的的操作数栈中</span></strong></p> </div> <br /> <p> </p> </div> <p> </p> </div> <img src ="http://www.aygfsteel.com/nkjava/aggbug/371971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2012-03-15 19:39 <a href="http://www.aygfsteel.com/nkjava/archive/2012/03/15/371971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM学习?JVM内存l构http://www.aygfsteel.com/nkjava/archive/2012/03/14/371831.html草原上的骆驼草原上的骆驼Wed, 14 Mar 2012 01:40:00 GMThttp://www.aygfsteel.com/nkjava/archive/2012/03/14/371831.htmlhttp://www.aygfsteel.com/nkjava/comments/371831.htmlhttp://www.aygfsteel.com/nkjava/archive/2012/03/14/371831.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/371831.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/371831.html

1.1     JVMq行

ClassLoader->RUNNTIME DATA AREA->EXECUTION ENGINE->NATIVE INTERFACE->NATIVE LIBRARIES

Class Loader:负责加蝲cd内存

RUNNTIME DATA AREA:负责

EXECUTION ENGINE:  解释?/span>Interpreter,负责解释命oQ提交到操作pȝ

NATIVE INTERFACE: ?/span>NATIVE METHOD STATCK中登?/span>NATIVEҎQ在Executive Engine执行时加?/span>native libraies.

 

 CLassLoader

cd载器的作用是加蝲cL件到内存Q比如编写一个HelloWord.javaE序Q然后通过javac~译成class文gQ那怎么才能加蝲到内存中被执行呢QClass Loader承担的就是这个责任,那不可能随便建立一?class文gp被加载的QClass Loader加蝲的class文g是有格式要求Q在《JVM Specification》中式这样定义Class文g的结构:

ClassFile {

 u4 magic;

u2 minor_version;

u2 major_version;

u2 constant_pool_count;

cp_info constant_pool[constant_pool_count-1];

u2 access_flags;

u2 this_class;

u2 super_class;

u2 interfaces_count;

u2 interfaces[interfaces_count];

u2 fields_count;

field_info fields[fields_count];

u2 methods_count;

method_info methods[methods_count];

u2 attributes_count;

attribute_info attributes[attributes_count];

}

需要详l了解的话,可以仔细阅读《JVM Specification》的W四?span>“The class File Format”Q这里不再详l说明?/span>

友情提示QClass Loader只管加蝲Q只要符合文件结构就加蝲Q至于说能不能运行,则不是它负责的,那是由Execution Engine负责的?/span>

Execution Engine 执行引擎

执行引擎也叫做解释器(Interpreter)Q负责解释命令,提交操作pȝ执行?/span>

Native Interface本地接口

本地接口的作用是融合不同的编E语a?/span>Java所用,它的初衷是融?/span>C/C++E序Q?/span>Java诞生的时候是C/C++横行的时候,要想立Q必L一个聪明的、睿智的调用C/C++E序Q于是就在内存中专门开辟了一块区域处理标Cؓnative的代码,它的具体做法?/span>Native Method Stack中登?/span>nativeҎQ在Execution Engine执行时加?/span>native libraies。目前该Ҏ使用的是来少了,除非是与g有关的应用,比如通过JavaE序驱动打印机,或?/span>Javapȝ理生讑֤Q在企业U应用中已经比较见Q因为现在的异构领域间的通信很发达,比如可以使用Socket通信Q也可以使用Web Service{等Q不多做介绍?/span>

 

?/span>NATIVE METHOD STATCK中登?/span>NATIVEҎQ在Executive Engine执行时加?/span>native libraies.

1.2     RUNTIME AREA

q行数据区是整个JVM的重炏V我们所有写的程序都被加载到q里Q之后才开始运行,Java生态系l如此的J荣Q得益于该区域的优良自治?/span>

 

 

PROGEAM COUNTER REGISTER

U程U有、指向下一条要很执行的指o

JAVA STACK

U程U有、存储局部变量表、操作栈、动态链接、方法出?/span>

NATIVE METHOD STACK

拟机使用到的Native Ҏ服务

HEAP

U程׃n

所有的对象实例以及数组都要在堆上分?/span>

回收器主要管理的对象

 

MEATHOD AREA

U程׃n的内存区?/span>

非堆主要区域

存储cM息、常量、静态变量、即时编译器~译后的代码

 

1.2.1     E序计数?/span>

E序计数器(Program Counter RegisterQ是一块较的内存I间Q它的作用可以看做是当前U程所执行的字节码的行hC器。在虚拟机的概念模型里(仅是概念模型Q各U虚拟机可能会通过一些更高效的方式去实现Q,字节码解释器工作时就是通过改变q个计数器的值来选取下一条需要执行的字节码指令,分支、@环、蟩转、异常处理、线E恢复等基础功能都需要依赖这个计数器来完成?/span>

 

׃Java 虚拟机的多线E是通过U程轮流切换q分配处理器执行旉的方式来实现

的,在Q何一个确定的时刻Q一个处理器Q对于多核处理器来说是一个内核)只会执行

一条线E中的指令。因此,ZU程切换后能恢复到正的执行位置Q每条线E都需?/span>

有一个独立的E序计数器,各条U程之间的计数器互不影响Q独立存储,我们U这cd

存区域ؓ“U程U有”的内存?/span>

 

如果U程正在执行的是一?/span>Java ҎQ这个计数器记录的是正在执行的虚拟机字节

码指令的地址Q如果正在执行的?/span>Natvie ҎQ这个计数器值则为空Q?/span>UndefinedQ。此

内存区域是唯一一个在Java 虚拟范中没有规定MOutOfMemoryError 情况的区域?/span>

 

1.2.2     ?/span>

与程序计数器一PJava 虚拟机栈Q?/span>Java Virtual Machine StacksQ也是线E私有的Q?/span>

它的生命周期与线E相同。虚拟机栈描q的?/span>Java Ҏ执行的内存模型:每个Ҏ被执

行的时候都会同时创Z个栈帧(Stack Frame①Q用于存储局部变量表、操作栈、动态链接、方法出口等信息?/span>

每一个方法被调用直至执行完成的过E,对应着一个栈帧在虚拟机栈中从入栈到出栈的q程?/span>

 l常有h?/span>Java 内存区分为堆内存Q?/span>HeapQ和栈内存(StackQ,q种分法比较_?/span>

p,Java 内存区域的划分实际上q比q复杂。这U划分方式的行只能说明大多数程?/span>

员最x的、与对象内存分配关系最密切的内存区域是q两块?/span>

 

其中所指的“?#8221;在后面会专门讲述Q而所指的“?#8221;是现在讲的虚拟机栈Q或者说是虚拟机栈中的局部变量表部分?/span>

 

局部变量表存放了编译期可知的各U基本数据类型(boolean?/span>byte?/span>char?/span>short?/span>int?/span>

float?/span>long?/span>doubleQ、对象引用(reference cdQ它

不等同于对象本nQ根据不同的虚拟机实玎ͼ它可能是一个指向对象v始地址的引用指针,也可能指向一个代表对象的句柄或者其他与此对象相关的位置Q和returnAddress cdQ指向了一条字节码指o的地址Q?/span>

其中64 位长度的long ?/span>double cd的数据会占用2 个局部变量空_SlotQ,其余

的数据类型只占用1 个?/span>

局部变量表所需的内存空间在~译期间完成分配Q当q入一个方法时Q这个方法需要在帧中分配多大的局部变量空间是完全定的,在方法运行期间不会改变局部变量表的大?/span>

 

?/span>Java 虚拟范中Q对q个区域规定了两U异常状况:如果U程h的栈深度?/span>

于虚拟机所允许的深度,抛?/span>StackOverflowError 异常Q如果虚拟机栈可以动态扩?/span>

Q当前大部分?/span>Java 虚拟机都可动态扩展,只不q?/span>Java 虚拟范中也允许固定长度的

虚拟机栈Q,当扩展时无法甌到够的内存时会抛出OutOfMemoryError 异常?/span>

 

1.2.3     本地Ҏ?/span>

本地Ҏ栈(Native Method StacksQ与虚拟机栈所发挥的作用是非常怼的,?/span>

区别不过是虚拟机栈ؓ虚拟机执?/span>Java ҎQ也是字节码)服务Q而本地方法栈?/span>

是ؓ虚拟Z用到?/span>Native Ҏ服务。虚拟机规范中对本地Ҏ栈中的方法用的?/span>

a、用方式与数据l构q没有强制规定,因此具体的虚拟机可以自由实现它。甚?/span>

有的虚拟机(譬如Sun HotSpot 虚拟机)直接把本地Ҏ栈和虚拟机栈合二Z?/span>

与虚拟机栈一P本地Ҏ栈区域也会抛?/span>StackOverflowError ?/span>OutOfMemoryError

异常?/span>

 

1.2.4     Java ?/span>

对于大多数应用来_Java 堆(Java HeapQ是Java 虚拟机所理的内存中最大的

一块?/span>

Java 堆是被所有线E共享的一块内存区域,在虚拟机启动时创建。此内存区域?/span>

唯一目的是存放对象实例Q几乎所有的对象实例都在q里分配内存。这一点在Java ?/span>

拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配,但是随着JIT ~译?/span>

的发展与逃逸分析技术的逐渐成熟Q栈上分配、标量替换优化技术将会导致一些微?/span>

的变化发生,所有的对象都分配在堆上也渐渐变得不是那?#8220;l对”了?/span>

 

Java 堆是垃圾攉器管理的主要区域Q因此很多时候也被称?#8220;GC ?#8221;Q?/span>Garbage

Collected HeapQ幸好国内没译?#8220;垃圾?#8221;Q。如果从内存回收的角度看Q由于现?/span>

攉器基本都是采用的分代攉法Q所?/span>Java 堆中q可以细分ؓQ新生代和老年代;

再细致一点的?/span>Eden I间?/span>From Survivor I间?/span>To Survivor I间{?/span>

如果从内存分配的角度看,U程׃n?/span>Java 堆中可能划分出多个线E私有的分配~冲区(Thread LocalAllocation BufferQ?/span>TLABQ。不q,无论如何划分Q都与存攑ֆҎ养I无论哪个区域Q存储的都仍然是对象实例Q进一步划分的目的是ؓ了更好地回收内存Q或者更快地分配内存?/span>

 

ҎJava 虚拟范的规定Q?/span>Java 堆可以处于物理上不连l的内存I间中,只要

逻辑上是q箋的即可,像我们的磁盘空间一栗在实现Ӟ既可以实现成固定大小

的,也可以是可扩展的Q不q当前主的虚拟机都是按照可扩展来实现的Q通过-Xmx

?/span>-Xms 控制Q。如果在堆中没有内存完成实例分配Qƈ且堆也无法再扩展Ӟ会抛出

OutOfMemoryError 异常?/span>

 

1.2.5     Ҏ?/span>

Ҏ区(Method AreaQ与Java 堆一P是各个线E共享的内存区域Q它用于?/span>

储已被虚拟机加蝲的类信息、常量、静态变量、即时编译器~译后的代码{数据。虽

?/span>Java 虚拟范把Ҏ区描qCؓ堆的一个逻辑部分Q但是它却有一个别名叫?/span>Non-

HeapQ非堆)Q目的应该是?/span>Java 堆区分开来?/span>

 

对于习惯?/span>HotSpot 虚拟Z开发和部vE序的开发者来_很多人愿意把Ҏ?/span>

UCؓ“怹?#8221;Q?/span>Permanent GenerationQ,本质上两者ƈ不等P仅仅是因?/span>HotSpot ?/span>

拟机的设计团队选择?/span>GC 分代攉扩展x法区Q或者说使用怹代来实现Ҏ?/span>

巌Ӏ对于其他虚拟机Q如BEA JRockit?/span>IBM J9 {)来说是不存在怹代的概念的。即

使是HotSpot 虚拟机本w,Ҏ官方发布的\U图信息Q现在也有放弃永久代q?#8220;搬家”

?/span>Native Memory 来实现方法区的规划了?/span>

 

Java 虚拟范对q个区域的限刉常宽松,除了?/span>Java 堆一样不需要连l的?/span>

存和可以选择固定大小或者可扩展外,q可以选择不实现垃圾收集。相对而言Q垃?/span>

攉行ؓ在这个区域是比较出现的Q但q数据q入了方法区如怹代的名字一

?#8220;怹”存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的?/span>

载,一般来说这个区域的回收“成W”比较难以令h满意Q尤其是cd的卸载,条g

相当苛刻Q但是这部分区域的回收确实是有必要的。在Sun 公司?/span>BUG 列表中,曑և

现过的若q个严重?/span>BUG 是׃低版本的HotSpot 虚拟机对此区域未完全回收而导

致内存泄漏?/span>

ҎJava 虚拟范的规定Q?/span> 当方法区无法满内存分配需求时Q?/span> 抛?/span>

OutOfMemoryError 异常?/span>

 

1.2.6     q行时常量池

 

q行时常量池Q?/span>Runtime Constant PoolQ是Ҏ区的一部分?/span>Class 文g中除了有

cȝ版本、字Dc方法、接口等描述{信息外Q还有一信息是帔R池(Constant Pool

TableQ,用于存放~译期生成的各种字面量和W号引用Q这部分内容在cd载后存放

到方法区的运行时帔R池中?/span>

 

Java 虚拟机对Class 文g的每一部分Q自然也包括帔R池)的格式都有严格的?/span>

定,每一个字节用于存储哪U数据都必须W合规范上的要求Q这h会被虚拟可?/span>

装蝲和执行。但对于q行时常量池Q?/span>Java 虚拟范没有做Ml节的要求,不同?/span>

提供商实现的虚拟机可以按照自q需要来实现q个内存区域。不q,一般来_?/span>

了保?/span>Class 文g中描q的W号引用外,q会把翻译出来的直接引用也存储在q行时常

量池中?/span>

 

q行时常量池相对?/span>Class 文g帔R池的另外一个重要特征是具备动态性,Java ?/span>

aq不要求帔R一定只能在~译期生,也就是ƈ非预|入Class 文g中常量池的内?/span>

才能q入Ҏ行时帔R池,q行期间也可能将新的帔R攑օ池中Q这U特性被开?/span>

人员利用得比较多的便?/span>String intern() Ҏ?/span>

 

既然q行时常量池是方法区的一部分Q自然会受到Ҏ区内存的限制Q当帔R池无

法再甌到内存时会抛?/span>OutOfMemoryError 异常

1.2.7     直接内存

直接内存Q?/span>Direct MemoryQƈ不是虚拟行时数据区的一部分Q也不是Java

虚拟范中定义的内存区域,但是q部分内存也被频J地使用Q而且也可能导?/span>

OutOfMemoryError 异常出现Q所以我们放到这里一赯解?/span>

?/span>JDK 1.4 中新加入?/span>NIOQ?/span>New Input/OutputQ类Q引入了一U基于通道Q?/span>ChannelQ?/span>

与缓冲区Q?/span>BufferQ的I/O 方式Q它可以使用Native 函数库直接分配堆外内存,?/span>

后通过一个存储在Java 堆里面的DirectByteBuffer 对象作ؓq块内存的引用进?/span>

操作。这栯在一些场景中显著提高性能Q因为避免了?/span>Java 堆和Native 堆中?/span>

回复制数据?/span>

昄Q本机直接内存的分配不会受到Java 堆大的限制Q但是,既然是内存,?/span>

肯定q是会受到本机d存(包括RAM ?/span>SWAP 区或者分|Ӟ的大及处理?/span>

dI间的限制。服务器理员配|虚拟机参数Ӟ一般会Ҏ实际内存讄-Xmx

{参C息,但经怼忽略掉直接内存,使得各个内存区域的d大于物理内存限制

Q包括物理上的和操作pȝU的限制Q,从而导致动态扩展时出现OutOfMemoryError

异常?/span>

 

好了Q到现在为止Q我们已l弄明白?/span>JVM的内存结构,下一章将对堆内存q行深入的学习?/span>



草原上的骆驼 2012-03-14 09:40 发表评论
]]>
卛_推出JVM内存分析pd文章-请大家关?/title><link>http://www.aygfsteel.com/nkjava/archive/2012/03/14/371827.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Wed, 14 Mar 2012 00:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2012/03/14/371827.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/371827.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2012/03/14/371827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/371827.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/371827.html</trackback:ping><description><![CDATA[主要包括Q?br />1、JVM内存l构<br />2、JVM?br />3、JVM?br />4、JVM的GC及配|?br />5、JVM内存调优<br />6、JVM内存异常<br />7、JVM内存ȝ<img src ="http://www.aygfsteel.com/nkjava/aggbug/371827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2012-03-14 08:40 <a href="http://www.aygfsteel.com/nkjava/archive/2012/03/14/371827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>System.getProperty()记录http://www.aygfsteel.com/nkjava/archive/2010/10/09/334063.html草原上的骆驼草原上的骆驼Sat, 09 Oct 2010 03:01:00 GMThttp://www.aygfsteel.com/nkjava/archive/2010/10/09/334063.htmlhttp://www.aygfsteel.com/nkjava/comments/334063.htmlhttp://www.aygfsteel.com/nkjava/archive/2010/10/09/334063.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/334063.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/334063.htmljava.version                      Java Runtime Environment version
java.vendor                       Java Runtime Environment vendor
java.vendor.url                   Java vendor URL
java.home                         Java installation directory
java.vm.specification.version     Java Virtual Machine specification version
java.vm.specification.vendor      Java Virtual Machine specification vendor
java.vm.specification.name        Java Virtual Machine specification name
java.vm.version                   Java Virtual Machine implementation version
java.vm.vendor                    Java Virtual Machine implementation vendor
java.vm.name                      Java Virtual Machine implementation name
java.specification.version        Java Runtime Environment specification version
java.specification.vendor         Java Runtime Environment specification vendor
java.specification.name           Java Runtime Environment specification name
java.
class.version                Java class format version number
java.
class.path                   Java class path
java.library.path                 List of paths to search when loading libraries
java.io.tmpdir                    Default temp file path
java.compiler                     Name of JIT compiler to use
java.ext.dirs                     Path of extension directory or directories
os.name                           Operating system name
os.arch                           Operating system architecture
os.version                        Operating system version
file.separator                    File separator (
"/" on UNIX)
path.separator                    Path separator (
":" on UNIX)
line.separator                    Line separator (
"\n" on UNIX)
user.name                         User
's account name
user.home                         User's home directory
user.dir                          User's current working directory

草原上的骆驼 2010-10-09 11:01 发表评论
]]>
开源搜索引擎的相关知识攉http://www.aygfsteel.com/nkjava/archive/2010/09/30/333462.html草原上的骆驼草原上的骆驼Thu, 30 Sep 2010 02:23:00 GMThttp://www.aygfsteel.com/nkjava/archive/2010/09/30/333462.htmlhttp://www.aygfsteel.com/nkjava/comments/333462.htmlhttp://www.aygfsteel.com/nkjava/archive/2010/09/30/333462.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/333462.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/333462.html
http://www.dbanotes.net/web/nutch.html Nutch初体?br /> http://larbin.sourceforge.net/index-eng.html Multi-purpose web crawler

NUTCH
http://today.java.net/pub/a/today/2006/01/10/introduction-to-nutch-1.html
http://today.java.net/pub/a/today/2006/02/16/introduction-to-nutch-2.html

http://apache.etoak.com//nutch/


Luck
http://www.getopt.org/luke/

对Nuch的评仯好,先做个标讎ͼ以后研究研究?br />


草原上的骆驼 2010-09-30 10:23 发表评论
]]>
JavaE序q行旉http://www.aygfsteel.com/nkjava/archive/2010/08/17/329143.html草原上的骆驼草原上的骆驼Tue, 17 Aug 2010 12:17:00 GMThttp://www.aygfsteel.com/nkjava/archive/2010/08/17/329143.htmlhttp://www.aygfsteel.com/nkjava/comments/329143.htmlhttp://www.aygfsteel.com/nkjava/archive/2010/08/17/329143.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/329143.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/329143.html//伪代?/span>
long startTime=System.currentTimeMillis();   //获取开始时?/span>
doSomeThing();  //试的代码段
long endTime=System.currentTimeMillis(); //获取l束旉
System.out.println("E序q行旉Q?nbsp;"+(end-start)+"ms"); 




//伪代?/span>
long startTime=System.nanoTime();   //获取开始时?/span>
doSomeThing();  //试的代码段
long endTime=System.nanoTime(); //获取l束旉
System.out.println("E序q行旉Q?nbsp;"+(end-start)+"ns");



]]>
JAVAc,JSPQServlet获取工程路径http://www.aygfsteel.com/nkjava/archive/2010/08/17/329142.html草原上的骆驼草原上的骆驼Tue, 17 Aug 2010 12:16:00 GMThttp://www.aygfsteel.com/nkjava/archive/2010/08/17/329142.htmlhttp://www.aygfsteel.com/nkjava/comments/329142.htmlhttp://www.aygfsteel.com/nkjava/archive/2010/08/17/329142.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/329142.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/329142.html在jsp和class文g中调用的相对路径不同?在jsp里,根目录是WebRoot 在class文g中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getProperty("user.dir")获取你工E的l对路径?/p>

?在Jsp,Servlet,Java中详l获得\径的Ҏ!

1.jsp中取得\径:

以工E名为TESTZQ?/p>

(1)得到包含工程名的当前面全\径:request.getRequestURI()
l果Q?TEST/test.jsp
(2)得到工程名:request.getContextPath()
l果Q?TEST
(3)得到当前面所在目录下全名Uͼrequest.getServletPath()
l果Q如果页面在jsp目录?/TEST/jsp/test.jsp
(4)得到面所在服务器的全路径Qapplication.getRealPath("面.jsp")
l果QD:"resin"webapps"TEST"test.jsp
(5)得到面所在服务器的绝对\径:absPath=new java.io.File(application.getRealPath(request.getRequestURI())).getParent();
l果QD:"resin"webapps"TEST

2.在类中取得\径:

(1)cȝl对路径QClass.class.getClass().getResource("/").getPath()
l果Q?D:/TEST/WebRoot/WEB-INF/classes/pack/
(2)得到工程的\径:System.getProperty("user.dir")
l果QD:"TEST

3.在Servlet中取得\径:

(1)得到工程目录Qrequest.getSession().getServletContext().getRealPath("") 参数可具体到包名?
l果QE:"Tomcat"webapps"TEST
(2)得到IE地址栏地址Qrequest.getRequestURL()
l果Qhttp://localhost:8080/TEST/test
(3)得到相对地址Qrequest.getRequestURI()
l果Q?TEST/test

草原上的骆驼 2010-08-17 20:16 发表评论
]]>
JSTL ?if else : ?c:if 没有 else 的处?/title><link>http://www.aygfsteel.com/nkjava/archive/2010/08/03/327867.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 03 Aug 2010 13:06:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2010/08/03/327867.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/327867.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2010/08/03/327867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/327867.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/327867.html</trackback:ping><description><![CDATA[<script type="text/javascript"> document.body.oncopy = function () { if (window.clipboardData) { setTimeout(function () { var text = clipboardData.getData("text"); if (text && text.length > 300) { text = text + ""r"n"n本文来自CSDN博客Q{载请标明出处Q? + location.href; clipboardData.setData("text", text); } }, 100); } } </script> <script type="text/javascript"> function StorePage() { d = document; t = d.selection ? (d.selection.type != 'None' ? d.selection.createRange().text : '') : (d.getSelection ? d.getSelection() : ''); void (keyit = window.open('http://www.365key.com/storeit.aspx?t=' + escape(d.title) + '&u=' + escape(d.location.href) + '&c=' + escape(t), 'keyit', 'scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes')); keyit.focus(); }</script> <p>jstl的c:if 没有else</p> <p><br /> 惌实现if...else...:</p> <p>可以用下面的解决</p> <p>--------------------------------------------------------------------</p> <p>l构Q?/p> <p><br /> <c:choose><br /> <br />    <c:when test="">    如果<br />    </c:when><br />    <br />    <c:otherwise>  否则<br />    </c:otherwise><br />   <br /> </c:choose></p> <p>代码Q?/p> <p><c:choose></p> <p>    <c:when test="${sessionScope.USERTYPE == 'inner'}"></p> <p>      <c:set value="${context_root}/igmgr/MEB004.dow" var="action" scope="page"/></p> <p>    </c:when></p> <p>    <c:when test="${sessionScope.USERTYPE == 'merc'}"></p> <p>      <c:set value="${context_root}/igmgr/MEB021.dow" var="action" scope="page"/></p> <p>    </c:when>   </p> <p>   <c:otherwise>  </p> <p>      <c:set value="${context_root}/igmgr/MEB020.dow" var="action" scope="page"/></p> <p>   </c:otherwise></p> <p>  </c:choose></p> <p>-------------------------------------------------------------------------</p> <p>附:详解+代码</p> <p>在同一?<c:choose> 中,当所?<c:when> 的条仉没有成立Ӟ则执? <c:otherwise> 的本体内宏V?/p> <p>  语法</p> <p>  <c:otherwise></p> <p>  本体内容</p> <p>  </c:otherwise></p> <p>  属?/p> <p>  ?/p> <p>  限制</p> <p>  ·<c:otherwise> 必须?<c:choose> ?</c:choose>之间</p> <p>  ·在同一?<c:choose> 中时Q?lt;c:otherwise> 必须为最后一个标{?/p> <p>  说明</p> <p>  在同一?<c:choose> 中,假若所?<c:when> 的test属性都不ؓtrueӞ则执? <c:otherwise> 的本体内宏V?/p> <p>  范例</p> <p>  W者D一个典型的 <c:choose>?lt;c:when>?lt;c:otherwise>范例Q?/p> <p>  <c:choose></p> <p>  <c:when test="${condition1}"></p> <p>  condition1为true</p> <p>  </c:when></p> <p>  <c:when test="${ condition2}"></p> <p>  condition2为true</p> <p>  </c:when></p> <p>  <c:otherwise></p> <p>  condition1和condition2都ؓfalse</p> <p>  </c:otherwise></p> <p>  </c:choose></p> <p>  范例说明Q当condition1为trueӞ会显C?#8220;condition1为true”Q当condition1为false? condition2为trueӞ会显C?#8220;condition2为true”Q如果两者都为falseQ则会显C?#8220;condition1? condition2都ؓfalse”?/p> <p>  注意</p> <p>  假若condition1和condition2两者都为trueӞ此时只会昄"condition1为true"Q这是因为在同一 ?lt;c:choose>下,当有好几?lt;c:when>都符合条件时Q只能有一?lt;c:when>成立?/p> <img src ="http://www.aygfsteel.com/nkjava/aggbug/327867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2010-08-03 21:06 <a href="http://www.aygfsteel.com/nkjava/archive/2010/08/03/327867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby on rails 试遇到的问?/title><link>http://www.aygfsteel.com/nkjava/archive/2009/12/10/305478.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 10 Dec 2009 12:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2009/12/10/305478.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/305478.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2009/12/10/305478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/305478.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/305478.html</trackback:ping><description><![CDATA[<br /> <br /> 新版Mysql密码法不同D“Client does not support authentication protocol requested by server”错误 <br /> MySql4.1.7密码法不同Q你可以做如下选择Q?<br /> <br /> 2)MySql的密码改用原来的那套法(本文介绍)  <br /> <br /> <br /> <br /> 安装很顺利,d到mysql <br /> <br /> G:\Mysql\bin>mysql -uroot <br /> <br /> mysql>...... <br /> <br /> 然后删除一些不用的帐号Q只留下了一个root帐号?<br /> <br /> 更新root密码Q?<br /> <br /> mysql>update user set password=password('password') where host='localhost' and user='root'; <br /> <br /> 成功Q?<br /> <br /> 退出ƈ重新启动Mysql服务?<br /> <br /> <br /> <br /> 修改Mysql用户名、密?<br /> <br /> <br /> l果很意外竟然弹出错误信息: <br /> <br /> Client does not support authentication protocol requested by server; <br /> <br /> <br /> <br /> 后来Q我用Google搜烦错误信息中的部分内容Q搜索到了Mysql的官方网站,一看,明白了,原来是password法的问题,因ؓ5.0.1版Mysql的password法?.23.44的算法不一样了 <br /> <br /> Q原文地址Q?a target="_blank">http://dev.mysql.com/doc/mysql/en/Old_client.htmlQ?/a> <br /> <br /> 采取官方|站的解军_法,一ơ搞定,嘿嘿 <br /> <br /> mysql>SET PASSWORD FOR <br />          >'root'@'localhost' = OLD_PASSWORD('newpassword'); <br /> <br /> 写此文章Q仅希望有同样问题的朋友能尽快解x问题?<br /> <br /> <br /> <h1 class="xspace-title">解决rails2.x no such file to load -- mysql的问?/h1> 启动后会提示Qno such file to load -- mysql<span style="display: none;">51Testing软g试|?v|?$Av'Zy'VR</span><br /> google了半天才扑ֈ了解x案,如下Q?span style="display: none;">nXOh iV3`0</span> <p><span style="display: none;">5Nsm} vU]0</span>讉K<a target="_blank" rel="nofollow">http://www.tmtm.org/en/ruby/mysql/</a> 下蝲<a >ruby-mysql-0.2.x.tar.gz</a>加压后,使用 ruby ./install.rb 命o安装mysql.rb .</p> <span style="display: none;">n,@-OrT7Z9ZG0</span> <p><span style="display: none;">;{pP6v)P+\0</span>感谢Weng Edagr提供的解x案?<br /> </p> 然后按照书上的例子,建数据库Q生成AddressBook应用E序Q运行Rails<br /> ruby script/server -d<br /> 没运行v来,昄如下Q?br /> <br /> c:/ruby/lib/ruby/1.8/yaml.rb:133:in `load': syntax error on line 18, col 2: `  h<br /> ost: localhost' (ArgumentError)<br /> <br /> Baidu了一下,发现是数据库配置文gconfig/database.yml有问?br /> <br /> development:<br />   adapter: mysql<br />   database: AddressBook<br />   username: root<br />   password: micronsky.net<br />   host: localhost<br /> <br /> :后面有一个空?br /> 修改q来Q再ơ运行,q是没v来,昄Q?br /> <br /> c:/ruby/lib/ruby/1.8/webrick/server.rb:29:in `fork': the fork() function is unim<br /> plemented on this machine (NotImplementedError)<br /> <br /> 又搜了半天,没找到原因,心想不会?d参数的问题吧Q于是去掉,q行QOKQ?br /> <br /> <br /> <img src ="http://www.aygfsteel.com/nkjava/aggbug/305478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2009-12-10 20:33 <a href="http://www.aygfsteel.com/nkjava/archive/2009/12/10/305478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java:重写equals()和hashCode()http://www.aygfsteel.com/nkjava/archive/2009/10/31/300523.html草原上的骆驼草原上的骆驼Sat, 31 Oct 2009 14:27:00 GMThttp://www.aygfsteel.com/nkjava/archive/2009/10/31/300523.htmlhttp://www.aygfsteel.com/nkjava/comments/300523.htmlhttp://www.aygfsteel.com/nkjava/archive/2009/10/31/300523.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/300523.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/300523.html 以下内容ȝ自?/span>Effective Java?/span>
1.何时需要重?/span>equals()
当一个类有自q有的“逻辑相等”概念Q不同于对象w䆾的概念)?/span>
2.设计equals()
[1]使用instanceof操作W检?#8220;实参是否为正的cd”?/span>
[2]对于cM的每一?#8220;关键?#8221;Q检查实参中的域与当前对象中对应的域倹{?/span>
[2.1]对于?/span>float?/span>doublecd的原语类型域Q?/span>==比较Q?/span>
[2.2]对于对象引用域,递归调用equalsҎQ?/span>
[2.3]对于float域,使用Float.floatToIntBits(afloat)转换?/span>intQ再使用==比较Q?/span>
[2.4]对于double域,使用Double.doubleToLongBits(adouble) 转换?/span>intQ再使用==比较Q?/span>
[2.5]对于数组域,调用Arrays.equalsҎ?/span>
3.当改?/span>equals()的时候,L要改?/span>hashCode()
Ҏ一个类?/span>equalsҎQ改写后Q,两个截然不同的实例有可能在逻辑上是相等的,但是Q根?/span>Object.hashCodeҎQ它们仅仅是两个对象。因此,q反?#8220;相等的对象必d有相{的散列?#8221;?/span>
4.设计hashCode()
[1]把某个非零常数|例如17Q保存在int变量result中;
[2]对于对象中每一个关键域fQ指equalsҎ中考虑的每一个域Q:
[2.1]boolean型,计算(f ? 0 : 1);
[2.2]byte,char,short型,计算(int);
[2.3]long型,计算(int) (f ^ (f>>>32));
[2.4]float型,计算Float.floatToIntBits(afloat);
[2.5]double型,计算Double.doubleToLongBits(adouble)得到一?/span>longQ再执行[2.3];
[2.6]对象引用Q递归调用它的hashCodeҎ;
[2.7]数组域,对其中每个元素调用它?/span>hashCodeҎ?/span>
[3]上面计得到的散列码保存到int变量cQ然后执?/span> result=37*result+c;
[4]q回result?/span>
5.CZ
下面的这个类遵@上面的设计原则,重写了类?/span>equals()?/span>hashCode()?br />
 package com.zj.unit;
import java.util.Arrays;
 
public class Unit {
    
private short ashort;
    
private char achar;
    
private byte abyte;
    
private boolean abool;
    
private long along;
    
private float afloat;
    
private double adouble;
    
private Unit aObject;
    
private int[] ints;
    
private Unit[] units;
 
    
public boolean equals(Object o) {
       
if (!(o instanceof Unit))
           
return false;
       Unit unit 
= (Unit) o;
       
return unit.ashort == ashort
              
&& unit.achar == achar
              
&& unit.abyte == abyte
              
&& unit.abool == abool
              
&& unit.along == along
              
&& Float.floatToIntBits(unit.afloat) == Float
                     .floatToIntBits(afloat)
              
&& Double.doubleToLongBits(unit.adouble) == Double
                     .doubleToLongBits(adouble)
              
&& unit.aObject.equals(aObject)
&& equalsInts(unit.ints)
              
&& equalsUnits(unit.units);
    }
 
    
private boolean equalsInts(int[] aints) {
       
return Arrays.equals(ints, aints);
    }
 
    
private boolean equalsUnits(Unit[] aUnits) {
       
return Arrays.equals(units, aUnits);
    }
 
    
public int hashCode() {
       
int result = 17;
       result 
= 37 * result + (int) ashort;
       result 
= 37 * result + (int) achar;
       result 
= 37 * result + (int) abyte;
       result 
= 37 * result + (abool ? 0 : 1);
       result 
= 37 * result + (int) (along ^ (along >>> 32));
       result 
= 37 * result + Float.floatToIntBits(afloat);
       
long tolong = Double.doubleToLongBits(adouble);
       result 
= 37 * result + (int) (tolong ^ (tolong >>> 32));
       result 
= 37 * result + aObject.hashCode();
       result 
= 37 * result + intsHashCode(ints);
       result 
= 37 * result + unitsHashCode(units);
       
return result;
    }
 
    
private int intsHashCode(int[] aints) {
       
int result = 17;
       
for (int i = 0; i < aints.length; i++)
           result 
= 37 * result + aints[i];
       
return result;
    }
 
    
private int unitsHashCode(Unit[] aUnits) {
       
int result = 17;
       
for (int i = 0; i < aUnits.length; i++)
           result 
= 37 * result + aUnits[i].hashCode();
       
return result;
    }
}



]]>
解析Java对象的equals()和hashCode()的?/title><link>http://www.aygfsteel.com/nkjava/archive/2009/10/31/300524.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sat, 31 Oct 2009 14:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2009/10/31/300524.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/300524.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2009/10/31/300524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/300524.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/300524.html</trackback:ping><description><![CDATA[原创 解析Java对象的equals()和hashCode()的?收藏<br /> <br /> 解析Java对象的equals()和hashCode()的?br /> 前言<br /> <br /> 在Java语言中,equals()和hashCode()两个函数的用是紧密配合的,你要是自p计其中一个,p设计另外一个。在多数情况下,q两 个函数是不用考虑的,直接使用它们的默认设计就可以了。但是在一些情况下Q这两个函数最好是自己设计Q才能确保整个程序的正常q行。最常见的是当一个对? 被加入收集对象(collection objectQ时Q这两个函数必须自己设计。更l化的定义是Q如果你惛_一个对象A攑օ另一个收集对象B里,或者用这个对象A为查找一个元对象在收集对 象B里位|的钥匙Qƈ支持是否容纳Q删除收集对象B里的元对象这L操作Q那么,equals()和hashCode()函数必须开发者自己定义。其他情 况下Q这两个函数是不需要定义的?br /> equals():<br /> <br /> 它是用于q行两个对象的比较的Q是对象内容的比较,当然也能用于q行对象参阅值的比较。什么是对象参阅值的比较Q就是两个参阅变量的值得比较Q我们都知道 参阅变量的值其实就是一个数字,q个数字可以看成是鉴别不同对象的代号。两个对象参阅值的比较Q就是两个数字的比较Q两个代L比较。这U比较是默认的对 象比较方式,在Objectq个对象中,q种方式已l设计好了。所以你也不用自己来重写Q浪费不必要的时间?br /> 对象内容的比较才是设计equals()的真正目的,Java语言对equals()的要求如下,q些要求是必遵循的。否则,你就不该费旉Q?br /> <br /> * 对称性:如果x.equals(y)q回?#8220;true”Q那么y.equals(x)也应该返回是“true”?br /> * 反射性:x.equals(x)必须q回?#8220;true”?br /> * cL性:如果x.equals(y)q回?#8220;true”Q而且y.equals(z)q回?#8220;true”Q那么z.equals(x)也应该返回是“true”?br /> * q有一致性:如果x.equals(y)q回?#8220;true”Q只要x和y内容一直不变,不管你重复x.equals(y)多少ơ,q回都是“true”?br /> * M情况下,x.equals(null)Q永q返回是“false”Qx.equals(和x不同cd的对?永远q回?#8220;false”?br /> <br /> hashCode():<br /> q个函数q回的就是一个用来进行赫希操作的整型代号Q请不要把这个代号和前面所说的参阅变量所代表的代号弄混了。后者不仅仅是个代号q具有在内存中才查找 对象的位|的功能。hashCode()所q回的值是用来分类对象在一些特定的攉对象中的位置。这些对象是HashMap, Hashtable, HashSetQ等{。这个函数和上面的equals()函数必须自己设计Q用来协助HashMap, Hashtable, HashSetQ等{对自己所攉的大量对象进行搜d定位?br /> <br /> q些攉对象I竟如何工作的,惌每个元对象hashCode是一个箱子的~码Q按照编码,每个元对象就是根据hashCode()提供的代号归入相应的 子里。所有的子加v来就是一个HashSetQHashMapQ或 Hashtable对象Q我们需要寻找一个元对象Ӟ先看它的代码Q就是hashCode()q回的整型|q样我们扑ֈ它所在的子Q然后在子里,? 个元对象都拿出来一个个和我们要扄对象q行ҎQ如果两个对象的内容相等Q我们的搜寻也就l束。这U操作需要两个重要的信息Q一是对象的 hashCode()Q还有一个是对象内容Ҏ的结果?br /> <br /> hashCode()的返回值和equals()的关pd下:<br /> <br /> * 如果x.equals(y)q回“true”Q那么x和y的hashCode()必须相等?br /> * 如果x.equals(y)q回“false”Q那么x和y的hashCode()有可能相{,也有可能不等?br /> <br /> <br /> Z么这两个规则是这LQ原因其实很单,拿HashSet来说吧,HashSet可以拥有一个或更多的箱子,在同一个箱子中可以有一个或更多的独特元 对象QHashSet所容纳的必L独特的元对象Q。这个例子说明一个元对象可以和其他不同的元对象拥有相同的hashCode。但是一个元对象只能和拥 有同样内容的元对象相{。所以这两个规则必须成立?br /> <br /> 设计q两个函数所要注意到的:<br /> 如果你设计的对象cdq不使用于收集性对象,那么没有必要自己再设计这两个函数的处理方式。这是正的面向对象设计ҎQQ何用户一时用不到的功能,先不要设计Q以免给日后功能扩展带来ȝ?br /> <br /> 如果你在设计时想别出心裁Q不遵守以上的两套规则,那么劝你q是不要做这h入非非的事。我q没有遇到过哪一个开发者和我说设计q两个函数要q背前面说的两个规则Q我到q些q反规则的情冉|Q都是作计错误处理?br /> <br /> 当一个对象类型作为收集型对象的元对象Ӟq个对象应该拥有自己处理equals()Q和/或处理hashCode()的设计,而且要遵守前面所说的两种 原则。equals()先要查null和是否是同一cd。查同一cd是ؓ了避免出现ClassCastExceptionq样的异常给丢出来。查 null是ؓ了避免出现NullPointerExceptionq样的异常给丢出来?br /> 如果你的对象里面容纳的数据过多,那么q两个函? equals()和hashCode()会变得效率低。如果对象中拥有无法serialized的数据,equals()有可能在操作中出现错误。想? 一个对象xQ它的一个整型数据是transient型(不能被serialize成二q制数据)。然而equals()和hashCode()都有依靠 q个整型数据Q那么,q个对象在serialization之前和之后,是否一P{案是不一栗因为serialization之前的整型数据是有效? 数据Q在serialization之后Q这个整型数据的值ƈ没有存储下来Q再重新׃q制数据{换成对象后,两者(对象在serialization 之前和之后)的状态已l不同了。这也是要注意的?br /> <br /> 知道以上q些能够帮助你:<br /> 1. q行更好的设计和开发?br /> 2. q行更好的测试案例开发?br /> 3. 在面试过E中让面试者对你的学识渊博感到满意? <img src ="http://www.aygfsteel.com/nkjava/aggbug/300524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2009-10-31 22:27 <a href="http://www.aygfsteel.com/nkjava/archive/2009/10/31/300524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l典的农夫养牛问?/title><link>http://www.aygfsteel.com/nkjava/archive/2009/10/31/300521.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sat, 31 Oct 2009 14:25:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2009/10/31/300521.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/300521.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2009/10/31/300521.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/300521.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/300521.html</trackback:ping><description><![CDATA[一个农夫养了一头牛Q三q后Q这头牛每年会生?头牛Q生出来的牛三年后,又可以每q生Z头牛……问农?0q后有多头?nq呢Q(用JAVA实现Q?br /> 很有名的一道题Q?1楼放出最l典的两U解题思\Q大家先试试 <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">   </span><span style="color: #000000;">1</span><span style="color: #000000;">.<br /> <br />           </span><span style="color: #0000ff;">package</span><span style="color: #000000;"> cn.edu.nankai;<br />           </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.HashSet;<br />           </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.Set;<br /> <br />           </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Cow<br />           {<br />           </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> age;<br /> <br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Cow()<br />           {<br />           age </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />           }<br /> <br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Cow bearCow()</span><span style="color: #008000;">//</span><span style="color: #008000;">生小?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">          {<br />           </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Cow();<br />           }<br /> <br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> grow()</span><span style="color: #008000;">//</span><span style="color: #008000;">每年牛龄?</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">          {<br />           age </span><span style="color: #000000;">=</span><span style="color: #000000;"> age </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />           }<br /> <br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> getAge()<br />           {<br />           </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> age;<br />           }<br />           }<br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Main {<br />           </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> Set cowSet </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> HashSet ();</span><span style="color: #008000;">//</span><span style="color: #008000;">牛圈Q存放所有的?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> check()</span><span style="color: #008000;">//</span><span style="color: #008000;">每年一遍所有的牛,q龄要加一Qƈ且够岁数了要生效?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">          {<br />           Set newCowSet </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> HashSet ();<br />           </span><span style="color: #0000ff;">for</span><span style="color: #000000;">(Cow cow : cowSet)<br />           {<br />           cow.grow();</span><span style="color: #008000;">//</span><span style="color: #008000;">q龄加一</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">          </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(cow.getAge() </span><span style="color: #000000;">>=</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;">)<br />           newCowSet.add(cow.bearCow());</span><span style="color: #008000;">//</span><span style="color: #008000;">够岁数的生小?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">          }<br />           cowSet.addAll(newCowSet);</span><span style="color: #008000;">//</span><span style="color: #008000;">把所有生出来的小牛放牛圈?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">          </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> cowSet.size();<br />           }<br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String args[])<br />           {<br />           Cow cow </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Cow();<br />           cowSet.add(cow);<br />           </span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;"><</span><span style="color: #000000;"> </span><span style="color: #000000;">10</span><span style="color: #000000;">; i </span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />           {<br />           System.out.println(i</span><span style="color: #000000;">+</span><span style="color: #000000;">1</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;"> : </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> check());<br />           }<br />           }<br /> <br />           }<br />           回复评论<br />           删除<br /> <br />    </span><span style="color: #000000;">1</span><span style="color: #000000;">.<br />       Smith的头?nbsp;    <br /> <br />       Smith </span><span style="color: #000000;">2009</span><span style="color: #000000;">/</span><span style="color: #000000;">10</span><span style="color: #000000;">/</span><span style="color: #000000;">31</span><span style="color: #000000;"> </span><span style="color: #000000;">21</span><span style="color: #000000;">:</span><span style="color: #000000;">12</span><span style="color: #000000;"><br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Cow {<br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> coun </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;<br /> <br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String args[]) {<br />           </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Cow().cowY(</span><span style="color: #000000;">10</span><span style="color: #000000;">);<br />           System.out.println(coun);<br />           </span><span style="color: #008000;">//</span><span style="color: #008000;">System.out.println(Cow.getNum(10));</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">          }<br /> <br /> <br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> getNum(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> i) {<br />           </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (i </span><span style="color: #000000;"><</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;">) {<br />           </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />           } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {<br />           </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> getNum(i </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">) </span><span style="color: #000000;">+</span><span style="color: #000000;"> getNum(i </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;">);<br /> <br />           }<br /> <br />           }<br />           </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> cowY(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> year) {<br />           </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> age </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />           </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (age </span><span style="color: #000000;"><=</span><span style="color: #000000;"> year) {<br />           age</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />           </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (age </span><span style="color: #000000;"><=</span><span style="color: #000000;"> year </span><span style="color: #000000;">&&</span><span style="color: #000000;"> age </span><span style="color: #000000;">>=</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;">) {<br />           coun</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />           cowY(year </span><span style="color: #000000;">-</span><span style="color: #000000;"> age);<br />           }<br />           }<br />           }<br />           }</span></div><img src ="http://www.aygfsteel.com/nkjava/aggbug/300521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2009-10-31 22:25 <a href="http://www.aygfsteel.com/nkjava/archive/2009/10/31/300521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java String ?StringBuffer 用法区别http://www.aygfsteel.com/nkjava/archive/2009/10/31/300522.html草原上的骆驼草原上的骆驼Sat, 31 Oct 2009 14:25:00 GMThttp://www.aygfsteel.com/nkjava/archive/2009/10/31/300522.htmlhttp://www.aygfsteel.com/nkjava/comments/300522.htmlhttp://www.aygfsteel.com/nkjava/archive/2009/10/31/300522.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/300522.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/300522.htmlStringcȝ来表C那些创建后׃会再改变的字W串Q它是immutable的。而StringBuffercȝ来表C内容可变的字符Ԍq提供了修改底层字符串的Ҏ?br />
Q-当我们进行字W拼接时Q请使用StringBufferc而非Stringc,因ؓ前者将比后者快上百倍?br />
的确Q在E序的太多场合我们都会进行字W串拼接工作Q简单的代码CZ如下Q?br />
String str="You are nice.";
str+="I love you so much.";

如果用StringBuffercȝ话,代码如下Q?br />
StringBuffer str= new StringBuffer("You ar


草原上的骆驼 2009-10-31 22:25 发表评论
]]>
Arrays.sort用法http://www.aygfsteel.com/nkjava/archive/2009/10/31/300519.html草原上的骆驼草原上的骆驼Sat, 31 Oct 2009 14:21:00 GMThttp://www.aygfsteel.com/nkjava/archive/2009/10/31/300519.htmlhttp://www.aygfsteel.com/nkjava/comments/300519.htmlhttp://www.aygfsteel.com/nkjava/archive/2009/10/31/300519.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/300519.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/300519.html

package test;

import java.util.Arrays;
import java.util.Comparator;

public class ArraySortDemo {
/**
* 整数型数l排?br />
*/
public void sortIntArray() {
   
int[] arrayToSort = new int[] { 4858980812345162 };
   System.out.println(
"整数型数l排?排序?");
   
for (int i = 0; i < arrayToSort.length; i++){
    System.out.print(arrayToSort[i]
+",");
   }
   
// 调用数组的静态排序方法sort
  Arrays.sort(arrayToSort);
   System.out.println();
   System.out.println(
"排序?");
   
for (int i = 0; i < arrayToSort.length; i++){
    System.out.print(arrayToSort[i]
+",");
   }
}

/**
* 字符型数l排序demo
*/
public void sortStringArray() {
   String[] arrayToSort 
= new String[] { "Oscar""Charlie""Ryan",
     
"Adam""David","aff","Aff" };
   System.out.println();
   System.out.println(
"字符型数l排?排序?");
   
for (int i = 0; i < arrayToSort.length; i++){
    System.out.print(arrayToSort[i]
+",");
   }
   System.out.println();
   System.out.println(
"排序?");
   
// 调用数组的静态排序方法sort
   Arrays.sort(arrayToSort);

   
for (int i = 0; i < arrayToSort.length; i++){
    System.out.print(arrayToSort[i]
+",");
   }
}

/**
* 对象数组排序demo
*/
public void sortObjectArray() {
   Dog o1 
= new Dog("dog1"1);
   Dog o2 
= new Dog("dog2"4);
   Dog o3 
= new Dog("dog3"5);
   Dog o4 
= new Dog("dog4"2);
   Dog o5 
= new Dog("dog5"3);
   Dog[] dogs 
= new Dog[] { o1, o2, o3, o4, o5 };
   System.out.println();
   System.out.println(
"对象数组排序排序?");
   
for (int i = 0; i < dogs.length; i++) {
    Dog dog 
= dogs[i];
    System.out.print(dog.getName()
+"["+dog.getWeight()+"],");
   }
   Arrays.sort(dogs, 
new ByWeightComparator());
   System.out.println();
   System.out.println(
"排序后:");
   
for (int i = 0; i < dogs.length; i++) {
    Dog dog 
= dogs[i];
    System.out.print(dog.getName()
+"["+dog.getWeight()+"],");
   }
}

public static void main(String[] args) {
   ArraySortDemo t 
= new ArraySortDemo();
   t.sortIntArray();
   t.sortStringArray();
   t.sortObjectArray();
}
}

/**
* 定义了一个Dogc?br />
*/
class Dog {
private String name;
private int weight;

public Dog(String name, int weight) {
   
this.setName(name);
   
this.weight = weight;
}

public int getWeight() {
   
return weight;
}

public void setWeight(int weight) {
   
this.weight = weight;
}

public void setName(String name) {
   
this.name = name;
}

public String getName() {
   
return name;
}
}

/**
* 因ؓ要对对象q行排序Q所以要实现java.util.Comparator接口的compare(T o1, T o2)ҎQ在该方法中自定义排序算法?br />
*/
class ByWeightComparator implements Comparator {
public final int compare(Object pFirst, Object pSecond) {
   
int aFirstWeight = ((Dog) pFirst).getWeight();
   
int aSecondWeight = ((Dog) pSecond).getWeight();
   
int diff = aFirstWeight - aSecondWeight;
   
if (diff > 0)
    
return 1;
   
if (diff < 0)
    
return -1;
   
else
    
return 0;
}
}

q行l果Q?br />
整数型数l排?排序?
48,5,89,80,81,23,45,16,2,
排序?
2,5,16,23,45,48,80,81,89,
字符型数l排?排序?
Oscar,Charlie,Ryan,Adam,David,aff,Aff,
排序?
Adam,Aff,Charlie,David,Oscar,Ryan,aff,
对象数组排序排序?
dog1[
1],dog2[4],dog3[5],dog4[2],dog5[3],
排序后:
dog1[
1],dog4[2],dog5[3],dog2[4],dog3[5],
地方
List list = new ArrayList() ;
list.add(
"abcd") ;
list.add(
"abdc") ;
list.add(
"aadf") ;
list.add(
"aabf") ;
/*list转ؓ数组*/
String[] strs 
= new String[list.size()] ;
list.toArray(strs) ;
/*排序Q只?<=索引<4之间的数?/span>*/
Arrays.sort(strs,
2,4) ;
for(String str : strs){
System.out.println(str) ;
}


草原上的骆驼 2009-10-31 22:21 发表评论
]]>
收藏一?Log4j的配|文?/title><link>http://www.aygfsteel.com/nkjava/archive/2009/08/18/291611.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 18 Aug 2009 02:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2009/08/18/291611.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/291611.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2009/08/18/291611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/291611.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/291611.html</trackback:ping><description><![CDATA[Log4JQ?a title="点击下蝲log4j配置文g" target="_blank" href="http://www.aygfsteel.com/Files/nkjava/log4j.rar">点击下蝲log4j配置文g</a><br /> <img src ="http://www.aygfsteel.com/nkjava/aggbug/291611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2009-08-18 10:48 <a href="http://www.aygfsteel.com/nkjava/archive/2009/08/18/291611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ssh开发遇到的错误Q不断更Chttp://www.aygfsteel.com/nkjava/archive/2009/05/25/277891.html草原上的骆驼草原上的骆驼Mon, 25 May 2009 11:51:00 GMThttp://www.aygfsteel.com/nkjava/archive/2009/05/25/277891.htmlhttp://www.aygfsteel.com/nkjava/comments/277891.htmlhttp://www.aygfsteel.com/nkjava/archive/2009/05/25/277891.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/277891.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/277891.html
~少 javassit库,在pom.xmld
 <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.8.0.GA</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

卛_解决


草原上的骆驼 2009-05-25 19:51 发表评论
]]>
netbeans6.5 开发jsf hellowordhttp://www.aygfsteel.com/nkjava/archive/2009/05/15/270943.html草原上的骆驼草原上的骆驼Fri, 15 May 2009 14:17:00 GMThttp://www.aygfsteel.com/nkjava/archive/2009/05/15/270943.htmlhttp://www.aygfsteel.com/nkjava/comments/270943.htmlhttp://www.aygfsteel.com/nkjava/archive/2009/05/15/270943.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/270943.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/270943.htmlJSF试图在不同的角度上提供网设计h员、应用程序设计h员、组件开发h员解x案,让不同技术的人员可以彼此合作又不互相q扰Q它l合了各家厂商现有的技术特点,?/span>Java Community ProcessQ?/span>JCPQ团队研拟出来的一套标准,q在2004q三月发表了JavaServer Faces 1.0实作成果?/span>

JSF的特点:

事g驱动

通用?/span>UIlg

开发工具采?/span> Netbeans6.5.

File- New Project—Java WEB—Web Application-点击 Next q入


Project Name: hellojsf, 点击NextQ进?br />

默认Q这里用的是Tomcat6.0服务器, 点击Next



q里我们N?/span> JavaServer Faces, 点击 Finish?/span>

选中 Hellojsf, q行该项目:


昄界面如下Q?br />



Web应用E序?/span>web.xmlQ?/span>JSFӞ所有的h都透过FacesServlet来处理,您可以如下定义:如下Q?/span>

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <context-param>

        <param-name>com.sun.faces.verifyObjects</param-name>

        <param-value>false</param-value>

    </context-param>

    <context-param>

        <param-name>com.sun.faces.validateXml</param-name>

        <param-value>true</param-value>

    </context-param>

    <context-param>

        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>

        <param-value>client</param-value>

    </context-param>

    <servlet>

        <servlet-name>Faces Servlet</servlet-name>

        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>Faces Servlet</servlet-name>

        <url-pattern>/faces/*</url-pattern>

    </servlet-mapping>

    <session-config>

        <session-timeout>

            30

        </session-timeout>

    </session-config>

    <welcome-file-list>

        <welcome-file>faces/welcomeJSF.jsp</welcome-file>

        </welcome-file-list>

</web-app>

好了Q先到这里,netbeans开?/span>jsf是不是很单?



]]>
Netbeans6.5 快捷键(不断ȝ中)http://www.aygfsteel.com/nkjava/archive/2009/05/12/270271.html草原上的骆驼草原上的骆驼Tue, 12 May 2009 11:36:00 GMThttp://www.aygfsteel.com/nkjava/archive/2009/05/12/270271.htmlhttp://www.aygfsteel.com/nkjava/comments/270271.htmlhttp://www.aygfsteel.com/nkjava/archive/2009/05/12/270271.html#Feedback1http://www.aygfsteel.com/nkjava/comments/commentRss/270271.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/270271.html 2、Ctrl+O 查找与给定字W串相匹配的c?
3、Shift+Ctrl+U生成该类的测试类
4、Shift+Ctrl+I 导入所有类所对应的包Q换成eclipse是Shift+Ctrl+O
5、Shift+Ctrl+F 在工E里找与l定字符串所在的文gQ可以设|文件的pattern
6、Shift+Ctrl+H 在工E里找与l定字符串所在的文gQƈ替换该字W串。可以设|文件的pattern
7、Shift+Alt+D 把某一文g单拿出来~辑

8、Ctrl+E 删除整行


草原上的骆驼 2009-05-12 19:36 发表评论
]]>
Eclipse+jetty+maven+Struts2+Spring2+Hibernate3+annotation注册pȝV1.0 没有实现0配置http://www.aygfsteel.com/nkjava/archive/2009/03/29/262708.html草原上的骆驼草原上的骆驼Sun, 29 Mar 2009 04:15:00 GMThttp://www.aygfsteel.com/nkjava/archive/2009/03/29/262708.htmlhttp://www.aygfsteel.com/nkjava/comments/262708.htmlhttp://www.aygfsteel.com/nkjava/archive/2009/03/29/262708.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/262708.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/262708.html<project xmlns="http://mav...  阅读全文

草原上的骆驼 2009-03-29 12:15 发表评论
]]>
JSTL session 很方便的q行session开?/title><link>http://www.aygfsteel.com/nkjava/archive/2009/03/16/259914.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sun, 15 Mar 2009 23:18:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2009/03/16/259914.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/259914.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2009/03/16/259914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/259914.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/259914.html</trackback:ping><description><![CDATA[<p>1.验证用户d<br /> <sql:query var="query" dataSource="${bookdev}"> <br />   select * from user where userName='${param.userName}' and userPwd='${param.userPwd}' <br /> </sql:query> </p> <p><c:if test="${empty query.rows}">  <br /> <span style="color: #0000ff;"><!--验证没有通过,q回d界面--></span> <br />   <font color="red">用户名或密码错误</font> <br />   <a href="index.jsp">重新d</a> <br /> </c:if> <br /> <c:if test="${!empty query.rows}">  <br /> <span style="color: #0000ff;"><!--验证通过Q保存用户信息到session?-> <br /> </span><c:forEach var="row" items="${query.rows}"> <br />     <c:set var="userName" value="${row.userName}" scope="session" /> <br />     <c:set var="userLevel" value="${row.userLevel}" scope="session" />  <br />  </c:forEach> <br />     <c:set var="isLog" value="1" scope="session" />  <br /> <span style="color: #0000ff;"><!--面发送到主页?-></span> <br />     <c:redirect url="main.jsp" /> <br /> </c:if> <br /> <br /> 2.session控制<br /> </p> <p><c:if test="${empty sessionScope.isLog}"> <br />  你没有登录或d时 <br />  <a href="index.jsp">重新d</a> <br /> </c:if> </p> <img src ="http://www.aygfsteel.com/nkjava/aggbug/259914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-16 07:18 <a href="http://www.aygfsteel.com/nkjava/archive/2009/03/16/259914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java_N?5道题 http://www.aygfsteel.com/nkjava/archive/2009/03/06/258126.html草原上的骆驼草原上的骆驼Fri, 06 Mar 2009 01:59:00 GMThttp://www.aygfsteel.com/nkjava/archive/2009/03/06/258126.htmlhttp://www.aygfsteel.com/nkjava/comments/258126.htmlhttp://www.aygfsteel.com/nkjava/archive/2009/03/06/258126.html#Feedback1http://www.aygfsteel.com/nkjava/comments/commentRss/258126.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/258126.html阅读全文

草原上的骆驼 2009-03-06 09:59 发表评论
]]>
javax.servlet.jsp.PageContext cannot be resolved to a type的解Z?/title><link>http://www.aygfsteel.com/nkjava/archive/2009/03/05/258073.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 05 Mar 2009 13:41:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2009/03/05/258073.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/258073.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2009/03/05/258073.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/258073.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/258073.html</trackback:ping><description><![CDATA[<span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry"> <h4 id="subjcns!4AD532D0CD18A21D!644">javax.servlet.jsp.PageContext cannot be resolved to a type的解Z?/h4> <div class="wmqeeuq" id="msgcns!4AD532D0CD18A21D!644" class="bvMsg"> <p>某個JSP內容如下Q在Eclipse會出現JSP Problem如標所C的javax.servlet.jsp.PageContext cannot be resolved to a typeQ?</p> <p><%@ taglib uri="/WEB-INF/tld/jstl/c.tld" prefix="c" %> </p> <p><c:set var="ctx" value="${pageContext.request.contextPath}"/> </p> <p>? E查詢,解決之道是把<c:set var="ctx" value="${pageContext.request.contextPath}"/>改為<c:set var="ctx" value="${pageContext.['request'].contextPath}"/>Q就不會出現這個problemQ可是奇怪的 是,之後再改?lt;c:set var="ctx" value="${pageContext.request.contextPath}"/>也沒再出N個problem。Eclipse? JSP的語法檢驗看來有未盡之處?/p> </div> </span> <img src ="http://www.aygfsteel.com/nkjava/aggbug/258073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-05 21:41 <a href="http://www.aygfsteel.com/nkjava/archive/2009/03/05/258073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>URLRewrite 实现URL地址伪静态化http://www.aygfsteel.com/nkjava/archive/2009/03/05/257933.html草原上的骆驼草原上的骆驼Thu, 05 Mar 2009 01:38:00 GMThttp://www.aygfsteel.com/nkjava/archive/2009/03/05/257933.htmlhttp://www.aygfsteel.com/nkjava/comments/257933.htmlhttp://www.aygfsteel.com/nkjava/archive/2009/03/05/257933.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/257933.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/257933.html1.首先?a target="_blank" >http://tuckey.org/urlrewrite/#download下蝲urlrewirtefilter

2.解压所下蝲的文?把urlrewrite-2.6.0.jar复制到项目的WebRoot/WEB-INF/lib/目录?/p>

3.把urlrewrite.xml复制到项目的WebRoot/WEB-INF/目录?/p>

4.在web.xml文g中加入filter

<filter>
<filter-name>UrlRewriteFilter</filter-name>
   
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
   
<init-param>
    
<param-name>logLevel</param-name>
    
<param-value>WARN</param-value>
   
</init-param>
</filter>
<filter-mapping>
   
<filter-name>UrlRewriteFilter</filter-name>
   
<url-pattern>/*</url-pattern>
</filter-mapping>


5.配置urlrewrite.xml
1.普通url静态化 例如:
要把http://localhost/prjtest/user/list.jsp转换?a href="http://localhost:8080/prjtest/user/list.html">http://localhost/prjtest/user/list.htmlq种是最单的,当一个servlet跌{到list.jsp面列出user列表?在urlrewrite.xml中这样配|?
<rule>
<from>^/user/list.html</from>
   
<to type="redirect">/user/list.jsp</to>
</rule>
当请?user/list.htmlq个面?实际上相当于h/user/list.jsp面,在servlet的蟩转要q样?response.sendRedirect("./user/list.html");

2要把http://localhost/prjtest/user/view.jsp?cid=1&cname=admin转换?a href="http://localhost/prjtest/user/view/1_admin.html">http://localhost/prjtest/user/view/1_admin.html在urlrewrite.xml中这样配|?

<rule>
<from>^/user/view/([0-9]+)_([a-z]+).html$</from>
<to type="redirect">/user/view.jsp?cid=$1&cname=$2</to>
</rule>

6特别说明
Z么地址栏不变?
原因在于浏览器昄的是最后被l定的URL。当一个URL被提交后Q在某一个组件返回一个相应给览器之 前,你的应用可能转发h多次。所有这些都发生在服务器端,览器ƈ不知道发生了什么事。当一个Http相应被放回时Q它q没有包含地址信息Q所以浏览器 仅仅昄用来作ؓ初始h的地址?br />
要想让地址栏也变成静态化的URLQ很单,?lt;to type="redirect">Ҏ<to type="forward">卛_






草原上的骆驼 2009-03-05 09:38 发表评论
]]>
Java U程学习Q?Q?sleep()和join()Ҏhttp://www.aygfsteel.com/nkjava/archive/2009/02/26/256885.html草原上的骆驼草原上的骆驼Thu, 26 Feb 2009 11:44:00 GMThttp://www.aygfsteel.com/nkjava/archive/2009/02/26/256885.htmlhttp://www.aygfsteel.com/nkjava/comments/256885.htmlhttp://www.aygfsteel.com/nkjava/archive/2009/02/26/256885.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/256885.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/256885.html 实例一Q?br />
public class ThreadTest implements Runnable{
 public void run(){
 
for(int k=0;k<5;k++){
 
if(k==2){
 
try{
 Thread.currentThread().sleep(
5000);
 }
 
catch(Exception e){}
 }
 System.out.println(Thread.currentThread().getName()
 
+":"+k);
 }
 }
 public static void main(String[] args){
 Runnable r
=new ThreadTest();
 Threadt 1
=new Thread(r,"t1_name");
 Threadt 2
=new Thread(r,"t2_name");
 t1.setPriority(Thread.MAX_PRIORITY);
 t2.setPriority(Thread.MIN_PRIORITY);
 t1.start();
 t2.start();
 }
}
t1被设|了最高的优先U,t2被设|了最低的优先U。t1不执行完Qt2没有机会执行。但׃t1在执行的中途休息了5U中Q这使得t2有Z执行了?br />
实例二:
public class ThreadTest implements Runnable{
 public synchronized void run(){
 
for(int k=0;k<5;k++){
 
if(k==2){
 
try{
 Thread.currentThread().sleep(
5000);
 }
 
catch(Exceptione){}
 }
 System.out.println(Thread.currentThread().getName()
 
+":"+k);
 }
 }
 publicstaticvoidmain(String[]args){
 Runnable r
=new ThreadTest();
 Threadt 1
=new Thread(r,"t1_name");
 Threadt 2
=new Thread(r,"t2_name");
 t1.start();
 t2.start();
 }
}
误者首先运行示例程序,从运行结果上看:一个线E在sleep的时候,q不会释放这个对象的锁标志?br />

joinQ)ҎQ?br /> join()ҎQ它能够使调用该Ҏ的线E在此之前执行完毕?br /> 实例a
public class ThreadTest implements Runnable{
 
public static int a=0;
 
public void run(){
 
for(intk=0;k<5;k++){
 a
=a+1;
 }
 }
 
public static void main(String[] args){
 Runnable r
=new ThreadTest();
 Thread t
=new Thread(r);
 t.start();
 System.out.println(a);
 }
}
q行l果不一定是5Q?如果惌 输出的结果是5Q?需要运用joinQ?br /> 把上面的代码Ҏ如下:
public class ThreadTest implements Runnable{
 
public static int a=0;
 
public void run(){
 
for(intk=0;k<5;k++){
 a
=a+1;
 }
 }
 
public static void main(String[] args){
 Runnable r
=new ThreadTest();
 Thread t
=new Thread(r);
 t.start();
     t.join();
 System.out.println(a);
 }
}
试一下以上的代码卛_Q答案ؓ输出5.join()Ҏ会抛出异常,应该提供捕获代码。或留给JDK捕获?br />


草原上的骆驼 2009-02-26 19:44 发表评论
]]>
JavaU程学习Q?Q:关键字synchronizedhttp://www.aygfsteel.com/nkjava/archive/2009/02/26/256884.html草原上的骆驼草原上的骆驼Thu, 26 Feb 2009 11:43:00 GMThttp://www.aygfsteel.com/nkjava/archive/2009/02/26/256884.htmlhttp://www.aygfsteel.com/nkjava/comments/256884.htmlhttp://www.aygfsteel.com/nkjava/archive/2009/02/26/256884.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/256884.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/256884.html
实例一Q?br />
public class FirstThread implements Runnable{
public synchronized void run(){
for(int i=1;i<10;i++){
System.out.println(
""+i);
}
}
public FirstThread(){
}
public static void main(String[] args){
Runnable r1
=new FirstThread();
Runnable r2
=new FirstThread();
Thread t1
=new Thread(r1);
Thread t2
=new Thread(r2);
t1.start();
t2.start();

}

}
在这个程序中Qrun()被加上了synchronized关键字。在mainҎ中创Z两个U程。你可能会认为此E序的运行结果一定ؓQ?123456789  0123456789。答案不是这样子的,q个E序中synchronized关键字保护的不是׃n数据Q其实在q个E序中synchronized? 键字没有起到M作用Q此E序的运行结果是不可预先定的)。这个程序中的t1,t2是两个对象(r1,r2Q的U程。JAVA是面向对象的E序设计? aQ不同的对象的数据是不同的,r1,r2有各自的run()ҎQ而synchronized使同一个对象的多个U程Q在某个时刻只有其中的一个线E可 以访问这个对象的synchronized数据?/strong>每个对象都有一?锁标?Q当q个对象的一个线E访问这个对象的某个synchronized数据Ӟ q个对象的所有被synchronized修饰的数据将被上锁(因ؓ"锁标?被当前线E拿CQ,只有当前U程讉K完它要访问的 synchronized数据Ӟ当前U程才会释放"锁标?Q这样同一个对象的其它U程才有Z讉Ksynchronized数据?br /> 实例二:
public class SecondThread implements Runnable{
public synchronized void run(){
for(int i=1;i<10;i++){
System.out.println(
""+i);
}
}
public SecondThread(){
}
public static void main(String[] args){
Runnable r
=new SecondThread();
//Runnable r2
=new FirstThread();
Thread t1
=new Thread(r);
Thread t2
=new Thread(r);
t1.start();
t2.start();

}

}

如果你运?000ơ这个程序,它的输出l果也一定每ơ都是:01234567890123456789。因里的synchronized保护的是׃n数据?strong>t1,t2是同一个对象(rQ的两个U程Q当其中的一个线E(例如Qt1Q开始执行run()ҎӞ׃run()? synchronized保护Q所以同一个对象的其他U程Qt2Q无法访问synchronizedҎQrunҎQ。只有当t1执行完后t2才有Z 执行?/strong>

实例三:

public class ThreeThread implements Runnable{
public  void run(){
synchronized(this){
for(int i=1;i<10;i++){
System.out.println(
""+i);
}}
}
public ThreeThread(){
}
public static void main(String[] args){
Runnable r
=new SecondThree();
//Runnable r2=new FirstThread();
Thread t1=new Thread(r);
Thread t2
=new Thread(r);
t1.start();
t2.start();

}

}

q个E序与示?的运行结果一栗在可能的情况下Q应该把保护范围~到最,可以用示?的Ş式,this代表"q个对象"。没有必要把整个run()保护hQrun()中的代码只有一个for循环Q所以只要保护for循环可以了?/p> 实例四:

public class FourThread implements Runnable{
public  void run(){
for(int i=1;i<10;i++){
System.out.println(
Thread.currentThread().getName()+"forloop"+i);
}

synchronized(this){
for(int i=1;i<10;i++){
System.out.println(
Thread.currentThread().getName()+"synchronized"+i);
}}
}
public SecondThread(){
}
public static void main(String[] args){
Runnable r
=new ThreeThread();
//Runnable r2=new FirstThread();
Thread t1=new Thread(r);
Thread t2
=new Thread(r);
t1.start();
t2.start();

}

}
t1_name:forloop:0
t1_name:forloop:1
t1_name:forloop:2
t2_name:forloop:0
t1_name:forloop:3
t2_name:forloop:1
t1_name:forloop:4
t2_name:forloop:2
t1_name:synchronizedforloop:0
t2_name:forloop:3
t1_name:synchronizedforloop:1
t2_name:forloop:4
t1_name:synchronizedforloop:2
t1_name:synchronizedforloop:3
t1_name:synchronizedforloop:4
t2_name:synchronizedforloop:0
t2_name:synchronizedforloop:1
t2_name:synchronizedforloop:2
t2_name:synchronizedforloop:3
t2_name:synchronizedforloop:4
W一个for循环没有受synchronized保护。对于第一个for循环Qt1,t2可以同时讉K。运行结?br /> 表明t1执行Ck=2 Ӟt2开始执行了。t1首先执行完了W一个for循环Q此时还没有执行完第一?br /> for循环Qt2刚执行到k=2Q。t1开始执行第二个for循环Q当 t1的第二个for循环执行到k=1Ӟt2
的第一个for循环执行完了。http://bianceng.cn(~程入门)
t2惛_始执行第二个for循环Q但׃t1首先执行了第二个for循环Q这个对象的锁标志自然在
t1手中QsynchronizedҎ的执行权也就落到了t1手中Q,在t1没执行完W二个for循环的时候,?br /> 是不会释N标志的?br /> 所以t2必须{到t1执行完第二个for循环后,它才可以执行W二个for循环


]]>
Java U程学习Q?Q?/title><link>http://www.aygfsteel.com/nkjava/archive/2009/02/26/256881.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 26 Feb 2009 11:26:00 GMT</pubDate><guid>http://www.aygfsteel.com/nkjava/archive/2009/02/26/256881.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/256881.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2009/02/26/256881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/256881.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/256881.html</trackback:ping><description><![CDATA[<div><strong>一、定义线E?/strong><br /> <em>1、扩展java.lang.ThreadcR?/em><br /> 此类中有个run()ҎQ应该注意其用法Q?br /> public void <strong>run</strong>()<br /> 如果该线E是使用独立?<code><font face="新宋?>Runnable</font></code> q行对象构造的Q则调用?<code><font face="新宋?>Runnable</font></code> 对象?<code><font face="新宋?>run</font></code> ҎQ否则,该方法不执行M操作q返回?br /> <code><font face="新宋?>Thread</font></code> 的子cd该重写该Ҏ?br /> <em>2、实现java.lang.Runnable接口?br /> </em> void <strong>run</strong>()<br /> 使用实现接口 <code><font face="新宋?>Runnable</font></code> 的对象创Z个线E时Q启动该U程导致在独立执行的线E中调用对象?<code><font face="新宋?>run</font></code> Ҏ?br /> <strong>二、实例化U程</strong><br /> 1 Threadcd例化<br /> 直接new卛_<br /> 2 Runnable实例?br /> 需要用Thread的构造函数实例化<strong><br /> </strong><br /> Thread(Runnable target)<br /> Thread(Runnable target, String name)<br /> Thread(ThreadGroup group, Runnable target)<br /> Thread(ThreadGroup group, Runnable target, String name)<br /> Thread(ThreadGroup group, Runnable target, String name, long stackSize) <br /> 是个单的多线E程序。run()和start()是大安很熟悉的两个Ҏ。把希望q行处理的代码都攑֜run()中;start()用于自动调用 run()Q这是JAVA的内在机制规定的。ƈ且run()的访问控制符必须是publicQ返回值必LvoidQ这U说法不准确Qrun()没有q回 |Qrun()不带参数?br /> <strong>?/strong><em>?/em><strong>实例化代?/strong><br /> Thread实例化线E?br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> FirstThread </span><span style="color: #0000ff;">extends</span><span style="color: #000000;"> Thread{<br />     </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> count</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">, number;<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> x</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />     FirstThread(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> number){<br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.number</span><span style="color: #000000;">=</span><span style="color: #000000;">number;<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">create thread</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">number);<br />     }<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;">  </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> run(){<br /> </span><span style="color: #008000;">//</span><span style="color: #008000;">        x=x+1;</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">) {            <br /> </span><span style="color: #008000;">//</span><span style="color: #008000;">            System.out.println("create thread"+x);</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">            System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">U程 </span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">number</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;">+</span><span style="color: #000000;">count);<br />             </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">++</span><span style="color: #000000;">count</span><span style="color: #000000;">==</span><span style="color: #000000;">6</span><span style="color: #000000;">)</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />         }        <br />     }<br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args){<br />     </span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;"><</span><span style="color: #000000;"> </span><span style="color: #000000;">5</span><span style="color: #000000;">; i</span><span style="color: #000000;">++</span><span style="color: #000000;">) </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> FirstThread(i</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">).start();<br /> }<br /> }</span></div> 输出Q(每次输出不同Q可见先建立的线Eƈ不是先执行,比较混ؕQ?br /> create thread1<br /> create thread2<br /> create thread3<br /> U程 1:计数 1<br /> U程 1:计数 2<br /> create thread4<br /> U程 1:计数 3<br /> U程 2:计数 1<br /> U程 1:计数 4<br /> U程 2:计数 2<br /> U程 2:计数 3<br /> U程 2:计数 4<br /> U程 2:计数 5<br /> U程 3:计数 1<br /> U程 3:计数 2<br /> U程 3:计数 3<br /> create thread5<br /> U程 3:计数 4<br /> U程 4:计数 1<br /> U程 4:计数 2<br /> U程 4:计数 3<br /> U程 4:计数 4<br /> U程 4:计数 5<br /> U程 3:计数 5<br /> U程 1:计数 5<br /> U程 5:计数 1<br /> U程 5:计数 2<br /> U程 5:计数 3<br /> U程 5:计数 4<br /> U程 5:计数 5<br /> <br /> Runnable实例化代?br /> <font color="black" size="2">如果cȝ承了别的c,׃能?Thread 了,p实现 Runnable 接口?</font><br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> FirstRunnale </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> Runnable{<br />     </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> number,count;<br />     FirstRunnale(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> number){<br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.number</span><span style="color: #000000;">=</span><span style="color: #000000;">number;<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">create thread</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">number);<br />     }<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> run(){<br /> </span><span style="color: #000000;">        </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">) {            <br /> </span><span style="color: #008000;">//</span><span style="color: #008000;">            System.out.println("create thread"+x);</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">            System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">U程 </span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">number</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;">+</span><span style="color: #000000;">count);<br />             </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">++</span><span style="color: #000000;">count</span><span style="color: #000000;">==</span><span style="color: #000000;">6</span><span style="color: #000000;">)</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />         }        <br />         <br />     } <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args){<br />         </span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;"><</span><span style="color: #000000;">5</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />             </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Thread(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> FirstRunnale(i</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">)).start();<br />         }<br />     }<br /> <br /> }<br /> </span></div> <strong>三、启动线E?</strong><br /> 在线E的Thread对象上调用start()ҎQ而不是run()或者别的方法?br /> 在调用start()Ҏ之前Q线E处于新状态中Q新状态指有一个Thread对象Q但q没有一个真正的U程?<br /> 在调用start()Ҏ之后Q发生了一pd复杂的事?br /> 启动新的执行U程Q具有新的调用栈Q;<br /> 该线E从新状态{Ud可运行状态;<br /> 当该U程获得Z执行Ӟ其目标run()Ҏ运行?br />  注意Q对Java来说Qrun()Ҏ没有M特别之处。像main()Ҏ一P它只是新U程知道调用的方法名U?和签?。因此,在Runnable上或者Thread上调用runҎ是合法的。但q不启动新的U程?br /> <strong>四、补充说?/strong><br /> 1、线E的名字Q一个运行中的线EL有名字的Q名字有两个来源Q一个是虚拟q的名字,<br /> <br /> 一个是你自q定的名字。在没有指定U程名字的情况下Q虚拟机M为线E指定名字,q且ȝ<br /> <br /> E的名字LmianQ非ȝE的名字不确定?br /> 2、线E都可以讄名字Q也可以获取U程的名字,q主U程也不例外?br /> 3、获取当前线E的对象的方法是QThread.currentThread()Q?br /> 4、在上面的代码中Q只能保证:每个U程都将启动Q每个线E都运行直到完成。一pdU程以某<br /> <br /> U顺序启动ƈ不意味着按该顺序执行。对于Q何一l启动的U程来说Q调度程序不能保证其执行<br /> <br /> ơ序Q持l时间也无法保证?br /> 5、当U程目标run()Ҏl束时该U程完成?br /> 6、一旦线E启动,它就永远不能再重新启动。只有一个新的线E可以被启动Qƈ且只能一ơ。一?br /> <br /> 可运行的U程或死U程可以被重新启动?br /> 7、线E的调度是JVM的一部分Q在一个CPU的机器上上,实际上一ơ只能运行一个线E。一ơ只有一<br /> <br /> 个线E栈执行。JVMU程调度E序军_实际q行哪个处于可运行状态的U程?br /> 众多可运行线E中的某一个会被选中做ؓ当前U程。可q行U程被选择q行的顺序是没有保障的?br /> 8、尽通常采用队列形式Q但q是没有保障的。队列Ş式是指当一个线E完?#8220;一?#8221;Ӟ它移?br /> <br /> 可运行队列的N{待Q直到它最l排队到该队列的前端为止Q它才能被再ơ选中。事实上Q我?br /> <br /> 把它UCؓ可运行池而不是一个可q行队列Q目的是帮助认识U程q不都是以某U有保障的顺序排?br /> <br /> 唱呢个一个队列的事实?br /> 9、尽我们没有无法控制线E调度程序,但可以通过别的方式来媄响线E调度的方式?br /> </div> <br /> <img src ="http://www.aygfsteel.com/nkjava/aggbug/256881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2009-02-26 19:26 <a href="http://www.aygfsteel.com/nkjava/archive/2009/02/26/256881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank">¬</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank">˹</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">ϼ</a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ī</a>| <a href="http://" target="_blank">Ұ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˴</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ͻ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">Ʊ</a>| <a href="http://" target="_blank">ǿ</a>| <a href="http://" target="_blank">̩</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>