﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Paul之Coder日记-随笔分类-Java</title><link>http://www.blogjava.net/llxiong/category/8430.html</link><description>收藏。</description><language>zh-cn</language><lastBuildDate>Tue, 25 Dec 2007 16:49:29 GMT</lastBuildDate><pubDate>Tue, 25 Dec 2007 16:49:29 GMT</pubDate><ttl>60</ttl><item><title>调整Eclipse启动参数</title><link>http://www.blogjava.net/llxiong/archive/2007/12/25/170252.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Tue, 25 Dec 2007 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2007/12/25/170252.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/170252.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2007/12/25/170252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/170252.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/170252.html</trackback:ping><description><![CDATA[<p>如果你觉得你的Eclipse在启动的时候很慢（比如说超过20秒钟），也许你要调整一下你的Eclipse启动参数了，以下是一些``小贴士'':</p>
<p>1. 检查启动Eclipse的JVM设置。 在Help\About Eclipse SDK\Configuration Detail里面，你可以看到启动Eclipse的JVM。 这个JVM和你在Eclipse中设置的Installed JDK是两回事情。 如果启动Eclipse的JVM还是JDK 1.4的话，那最好改为JDK 5，因为JDK 5的性能比1.4更好。</p>
<p><code>C:\eclipse\eclipse.exe -vm "C:\Program Files\Java\jdk1.5.0_08\ bin\javaw.exe"</code></p>
<p>2. 检查Eclipse所使用的heap的大小。 在C:\eclipse目录下有一个配置文件eclipse.ini，其中配置了Eclipse启动的默认heap大小</p>
<p><code>-vmargs<br />
-Xms40M<br />
-Xmx256M</code></p>
<p>所以你可以把默认值改为:</p>
<p><code>-vmargs<br />
-Xms256M<br />
-Xmx512M</code></p>
<p>当然，也可以这样做，把堆的大小改为256 - 512。</p>
<p><code>C:\eclipse\eclipse.exe -vm "C:\Program Files\Java\jdk1.5.0_08\ bin\javaw.exe" -vmargs -Xms256M -Xmx512M</code></p>
<p>3. 其他的启动参数。 如果你有一个双核的CPU，也许可以尝试这个参数:</p>
<p><code>-XX:+UseParallelGC</code></p>
<p>让GC可以更快的执行。（只是JDK 5里对GC新增加的参数）</p>
<img src ="http://www.blogjava.net/llxiong/aggbug/170252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2007-12-25 10:55 <a href="http://www.blogjava.net/llxiong/archive/2007/12/25/170252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：Java同步机制浅谈――synchronized对代码作何影响？</title><link>http://www.blogjava.net/llxiong/archive/2007/10/11/152027.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Thu, 11 Oct 2007 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2007/10/11/152027.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/152027.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2007/10/11/152027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/152027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/152027.html</trackback:ping><description><![CDATA[<span id="ArticleContent1_ArticleContent1_lblContent">&nbsp;
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">Java</font><span style="font-family: 宋体">对多线程的支持与同步机制深受大家的喜爱，似乎看起来使用了</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">关键字就可以轻松地解决多线程共享数据同步问题。到底如何？――还得对</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">关键字的作用进行深入了解才可定论。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">总的说来，</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">关键字可以作为函数的修饰符，也可作为函数内的语句，也就是平时说的同步方法和同步语句块。如果再细的分类，</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">可作用于</span><font face="Times New Roman">instance</font><span style="font-family: 宋体">变量、</span><font face="Times New Roman">object reference</font><span style="font-family: 宋体">（对象引用）、</span><font face="Times New Roman">static</font><span style="font-family: 宋体">函数和</span><font face="Times New Roman">class literals(</font><span style="font-family: 宋体">类名称字面常量</span><font face="Times New Roman">)</font><span style="font-family: 宋体">身上。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><font size="3">在进一步阐述之前，我们需要明确几点：</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">A</font><span style="font-family: 宋体">．无论</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">关键字加在方法上还是对象上，它取得的锁都是对象，而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">B</font><span style="font-family: 宋体">．每个对象只有一个锁（</span><font face="Times New Roman">lock</font><span style="font-family: 宋体">）与之相关联。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">C</font><span style="font-family: 宋体">．实现同步是要很大的系统开销作为代价的，甚至可能造成死锁，所以尽量避免无谓的同步控制。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><strong><span style="font-family: 宋体">接着来讨论</span><font face="Times New Roman">synchronized</font></strong><strong><span style="font-family: 宋体">用到不同地方对代码产生的影响：</span></strong></font>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">假设</span><font face="Times New Roman">P1</font><span style="font-family: 宋体">、</span><font face="Times New Roman">P2</font><span style="font-family: 宋体">是同一个类的不同对象，这个类中定义了以下几种情况的同步块或同步方法，</span><font face="Times New Roman">P1</font><span style="font-family: 宋体">、</span><font face="Times New Roman">P2</font><span style="font-family: 宋体">就都可以调用它们。</span></font>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -39pt; tab-stops: list 18.0pt"><font face="Times New Roman"><font size="3">1．</font>&nbsp;</font><font size="3"><span style="font-family: 宋体">把</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">当作函数修饰符时，示例代码如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font face="Times New Roman" size="3">Public synchronized void methodAAA()</font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font face="Times New Roman" size="3">{</font></p>
<p style="margin: 0cm 0cm 0pt 63pt"><font face="Times New Roman" size="3">//&#8230;.</font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font face="Times New Roman" size="3">}</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">这也就是同步方法，那这时</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">锁定的是哪个对象呢？它锁定的是调用这个同步方法对象。也就是说，当一个对象</span><font face="Times New Roman">P1</font><span style="font-family: 宋体">在不同的线程中执行这个同步方法时，它们之间会形成互斥，达到同步的效果。但是这个对象所属的</span><font face="Times New Roman">Class</font><span style="font-family: 宋体">所产生的另一对象</span><font face="Times New Roman">P2</font><span style="font-family: 宋体">却可以任意调用这个被加了</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">关键字的方法。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><font size="3">上边的示例代码等同于如下代码：</font></span></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font face="Times New Roman" size="3">public void methodAAA()</font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font face="Times New Roman" size="3">{</font></p>
<p style="margin: 0cm 0cm 0pt 63pt"><font face="Times New Roman" size="3">synchronized (this)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;(1)</font></p>
<p style="margin: 0cm 0cm 0pt 63pt"><font face="Times New Roman" size="3">{</font></p>
<p style="margin: 0cm 0cm 0pt 63pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&#8230;..</font></font></p>
<p style="margin: 0cm 0cm 0pt 63pt"><font face="Times New Roman" size="3">}</font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font face="Times New Roman" size="3">}</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">&nbsp;(1)</font><span style="font-family: 宋体">处的</span><font face="Times New Roman">this</font><span style="font-family: 宋体">指的是什么呢？它指的就是调用这个方法的对象，如</span><font face="Times New Roman">P1</font><span style="font-family: 宋体">。可见同步方法实质是将</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">作用于</span><font face="Times New Roman">object reference</font><span style="font-family: 宋体">。――那个拿到了</span><font face="Times New Roman">P1</font><span style="font-family: 宋体">对象锁的线程，才可以调用</span><font face="Times New Roman">P1</font><span style="font-family: 宋体">的同步方法，而对</span><font face="Times New Roman">P2</font><span style="font-family: 宋体">而言，</span><font face="Times New Roman">P1</font><span style="font-family: 宋体">这个锁与它毫不相干，程序也可能在这种情形下摆脱同步机制的控制，造成数据混乱：（</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">2</font><span style="font-family: 宋体">．同步块，示例代码如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void method3(SomeObject so)</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized(so)</font></font></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: 21pt"><font face="Times New Roman" size="3">{</font></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&#8230;..</font></font></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: 21pt"><font face="Times New Roman" size="3">}</font></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><font face="Times New Roman" size="3">}</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">这时，锁就是</span><font face="Times New Roman">so</font><span style="font-family: 宋体">这个对象，谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时，就可以这样写程序，但当没有明确的对象作为锁，只是想让一段代码同步时，可以创建一个特殊的</span><font face="Times New Roman">instance</font><span style="font-family: 宋体">变量（它得是一个对象）来充当锁：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font face="Times New Roman" size="3">class Foo implements Runnable</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font face="Times New Roman" size="3">{</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private byte[] lock = new byte[0];&nbsp;// </font><span style="font-family: 宋体">特殊的</span><font face="Times New Roman">instance</font><span style="font-family: 宋体">变量</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp; Public void methodA()</font></font></p>
<p style="margin: 0cm 0cm 0pt 20.25pt; text-indent: 21.75pt"><font face="Times New Roman" size="3">{</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized(lock) { //&#8230; }</font></font></p>
<p style="margin: 0cm 0cm 0pt 20.25pt; text-indent: 21.75pt"><font face="Times New Roman" size="3">}</font></p>
<p style="margin: 0cm 0cm 0pt 20.25pt; text-indent: 21.75pt"><font face="Times New Roman" size="3">//&#8230;..</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font face="Times New Roman" size="3">}</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体">注：零长度的</span><font face="Times New Roman">byte</font><span style="font-family: 宋体">数组对象创建起来将比任何对象都经济――查看编译后的字节码：生成零长度的</span><font face="Times New Roman">byte[]</font><span style="font-family: 宋体">对象只需</span><font face="Times New Roman">3</font><span style="font-family: 宋体">条操作码，而</span><font face="Times New Roman">Object lock = new Object()</font><span style="font-family: 宋体">则需要</span><font face="Times New Roman">7</font><span style="font-family: 宋体">行操作码。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">3</font><span style="font-family: 宋体">．将</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">作用于</span><font face="Times New Roman">static </font><span style="font-family: 宋体">函数，示例代码如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class Foo </font></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font face="Times New Roman" size="3">{</font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font size="3"><font face="Times New Roman">public synchronized static void methodAAA()&nbsp;&nbsp; // </font><span style="font-family: 宋体">同步的</span><font face="Times New Roman">static </font><span style="font-family: 宋体">函数</span></font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font face="Times New Roman" size="3">{</font></p>
<p style="margin: 0cm 0cm 0pt 63pt"><font face="Times New Roman" size="3">//&#8230;.</font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font face="Times New Roman" size="3">}</font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font face="Times New Roman" size="3">public void methodBBB()</font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font face="Times New Roman" size="3">{</font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized(Foo.class)&nbsp;&nbsp; //&nbsp;class literal(</font><span style="font-family: 宋体">类名称字面常量</span><font face="Times New Roman">)</font></font></p>
<p style="margin: 0cm 0cm 0pt 42pt"><font face="Times New Roman" size="3">}</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp; </font><span style="font-family: 宋体">代码中的</span><font face="Times New Roman">methodBBB()</font><span style="font-family: 宋体">方法是把</span><font face="Times New Roman">class literal</font><span style="font-family: 宋体">作为锁的情况，它和同步的</span><font face="Times New Roman">static</font><span style="font-family: 宋体">函数产生的效果是一样的，取得的锁很特别，是当前调用这个方法的对象所属的类（</span><font face="Times New Roman">Class</font><span style="font-family: 宋体">，而不再是由这个</span><font face="Times New Roman">Class</font><span style="font-family: 宋体">产生的某个具体对象了）。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">记得在《</span><font face="Times New Roman">Effective Java</font><span style="font-family: 宋体">》一书中看到过将</span><font face="Times New Roman"> Foo.class</font><span style="font-family: 宋体">和</span><font face="Times New Roman"> P1.getClass()</font><span style="font-family: 宋体">用于作同步锁还不一样，不能用</span><font face="Times New Roman">P1.getClass()</font><span style="font-family: 宋体">来达到锁这个</span><font face="Times New Roman">Class</font><span style="font-family: 宋体">的目的。</span><font face="Times New Roman">P1</font><span style="font-family: 宋体">指的是由</span><font face="Times New Roman">Foo</font><span style="font-family: 宋体">类产生的对象。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">可以推断：如果一个类中定义了一个</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">的</span><font face="Times New Roman">static</font><span style="font-family: 宋体">函数</span><font face="Times New Roman">A</font><span style="font-family: 宋体">，也定义了一个</span><font face="Times New Roman">synchronized </font><span style="font-family: 宋体">的</span><font face="Times New Roman">instance</font><span style="font-family: 宋体">函数</span><font face="Times New Roman">B</font><span style="font-family: 宋体">，那么这个类的同一对象</span><font face="Times New Roman">Obj</font><span style="font-family: 宋体">在多线程中分别访问</span><font face="Times New Roman">A</font><span style="font-family: 宋体">和</span><font face="Times New Roman">B</font><span style="font-family: 宋体">两个方法时，不会构成同步，因为它们的锁都不一样。</span><font face="Times New Roman">A</font><span style="font-family: 宋体">方法的锁是</span><font face="Times New Roman">Obj</font><span style="font-family: 宋体">这个对象，而</span><font face="Times New Roman">B</font><span style="font-family: 宋体">的锁是</span><font face="Times New Roman">Obj</font><span style="font-family: 宋体">所属的那个</span><font face="Times New Roman">Class</font><span style="font-family: 宋体">。</span></font>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><font size="3">小结如下：</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">搞清楚</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">锁定的是哪个对象，就能帮助我们设计更安全的多线程程序。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><span>
<p><font face="Times New Roman" size="3">&nbsp;</font></p>
</span>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="3">还有一些技巧可以让我们对共享资源的同步访问更加安全：</font></span></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font face="Times New Roman"><font size="3">1．</font>&nbsp;</font><font size="3"><span style="font-family: 宋体">定义</span><font face="Times New Roman">private </font><span style="font-family: 宋体">的</span><font face="Times New Roman">instance</font><span style="font-family: 宋体">变量</span><font face="Times New Roman">+</font><span style="font-family: 宋体">它的</span><font face="Times New Roman"> get</font><span style="font-family: 宋体">方法，而不要定义</span><font face="Times New Roman">public/protected</font><span style="font-family: 宋体">的</span><font face="Times New Roman">instance</font><span style="font-family: 宋体">变量。如果将变量定义为</span><font face="Times New Roman">public</font><span style="font-family: 宋体">，对象在外界可以绕过同步方法的控制而直接取得它，并改动它。这也是</span><font face="Times New Roman">JavaBean</font><span style="font-family: 宋体">的标准实现方式之一。</span></font></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><font face="Times New Roman"><font size="3">2．</font>&nbsp;</font><font size="3"><span style="font-family: 宋体">如果</span><font face="Times New Roman">instance</font><span style="font-family: 宋体">变量是一个对象，如数组或</span><font face="Times New Roman">ArrayList</font><span style="font-family: 宋体">什么的，那上述方法仍然不安全，因为当外界对象通过</span><font face="Times New Roman">get</font><span style="font-family: 宋体">方法拿到这个</span><font face="Times New Roman">instance</font><span style="font-family: 宋体">对象的引用后，又将其指向另一个对象，那么这个</span><font face="Times New Roman">private</font><span style="font-family: 宋体">变量也就变了，岂不是很危险。</span><span style="font-family: 宋体">这个时候就需要将</span><font face="Times New Roman">get</font><span style="font-family: 宋体">方法也加上</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">同步，并且，只返回这个</span><font face="Times New Roman">private</font><span style="font-family: 宋体">对象的</span><font face="Times New Roman">clone()</font><span style="font-family: 宋体">――这样，调用端得到的就是对象副本的引用了。</span></font></p>
</span><br />
<img src ="http://www.blogjava.net/llxiong/aggbug/152027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2007-10-11 14:19 <a href="http://www.blogjava.net/llxiong/archive/2007/10/11/152027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：DWR实践Ajax</title><link>http://www.blogjava.net/llxiong/archive/2007/07/29/133082.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Sun, 29 Jul 2007 01:17:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2007/07/29/133082.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/133082.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2007/07/29/133082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/133082.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/133082.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/llxiong/archive/2007/07/29/133082.html'>阅读全文</a><img src ="http://www.blogjava.net/llxiong/aggbug/133082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2007-07-29 09:17 <a href="http://www.blogjava.net/llxiong/archive/2007/07/29/133082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象与实例区别</title><link>http://www.blogjava.net/llxiong/archive/2007/07/05/128231.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Thu, 05 Jul 2007 00:47:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2007/07/05/128231.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/128231.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2007/07/05/128231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/128231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/128231.html</trackback:ping><description><![CDATA[<br><br>类--&gt;对象--&gt;实例<br><br>人类是类<br>某个人是对象<br>你是实例<br>实例本身也是对象。<br><br>表现出来是这样的<br>String 类<br>String str&nbsp;&nbsp; str是对象<br>String str = "abc";&nbsp; "abc"是实例，也是对象.<br>这样也能解释instance of object这种说法&nbsp; str的实例是"abc"
<img src ="http://www.blogjava.net/llxiong/aggbug/128231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2007-07-05 08:47 <a href="http://www.blogjava.net/llxiong/archive/2007/07/05/128231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ResultSet的关闭问题</title><link>http://www.blogjava.net/llxiong/archive/2006/03/23/37098.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Thu, 23 Mar 2006 14:27:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/23/37098.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/37098.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/23/37098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/37098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/37098.html</trackback:ping><description><![CDATA[
		<p>在Connection上调用close方法会关闭Statement和ResultSet吗？</p>
		<p>级联的关闭这听起来好像很有道理，而且在很多地方这样做也是正确的，通常这样写<br />Connection con = getConnection();//getConnection is your method<br />PreparedStatement ps = con.prepareStatement(sql);<br />ResultSet rs = ps.executeQuery();<br />……<br />///rs.close();<br />///ps.close();<br />con.close();  // NO!<br />这样做的问题在于Connection是个接口，它的close实现可能是多种多样的。在普通情况下，你用 DriverManager.getConnection()得到一个Connection实例，调用它的close方法会关闭Statement和 ResultSet。但是在很多时候，你需要使用数据库连接池，在连接池中的得到的Connection上调用close方法的时候，Connection可能并没有被释放，而是回到了连接池中。它以后可能被其它代码取出来用。如果没有释放Statement和ResultSet，那么在Connection上没有关闭的Statement和ResultSet可能会越来越多，那么……<br />相反，我看到过这样的说法，有人把Connection关闭了，却继续使用ResultSet，认为这样是可以的，引发了激烈的讨论，到底是怎么回事就不用我多说了吧。</p>
		<p>所以我们必须很小心的释放数据库资源，下面的代码片断展示了这个过程</p>
		<p>Connection con = null;<br />PreparedStatement ps = null;<br />ResultSet rs = null;</p>
		<p>try {<br />    con = getConnection();//getConnection is your method<br />    ps = con.prepareStatement(sql);<br />    rs = ps.executeQuery();<br />    ///...........<br />}<br />catch (SQLException ex) {<br />    ///错误处理<br />}<br />finally{<br />    try {<br />        if(ps!=null)<br />            ps.close();<br />    }<br />    catch (SQLException ex) {<br />        ///错误处理<br />    }<br />    try{<br />        if(con!=null)<br />            con.close();<br />    }<br />    catch (SQLException ex) {<br />        ///错误处理<br />    }<br />}</p>
		<p> </p>
<img src ="http://www.blogjava.net/llxiong/aggbug/37098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-23 22:27 <a href="http://www.blogjava.net/llxiong/archive/2006/03/23/37098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>迭代模式Iterator </title><link>http://www.blogjava.net/llxiong/archive/2006/03/22/36931.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Wed, 22 Mar 2006 14:35:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/22/36931.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/36931.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/22/36931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/36931.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/36931.html</trackback:ping><description><![CDATA[
		<p>问题：</p>
		<p>在ArrayList 应用中有这样的代码：</p>
		<p>ArrayList a=new ArrayList();</p>
		<p>a.add(...);</p>
		<p>Iterator i=a.iterator();</p>
		<p>理解：Iterator i=a.iterator();</p>
		<p>Iterator 是一个接口，在上面a.iterator()方法的作用是返回一个接口<br />hasmore（），next（）是怎么被实现的？<br /><br />处理：<br />迭代模式<br />ArrayList内部有一个实现了Iterator 接口的类，a.iterator就是返回它内部类的一个实例，即返回一个实现了的iterator接口的类。<br /><br />接口是一个类型，相当于一个父类型（supertype），可以用一个接口引用一个实现了此接口的类的实例。这样只能用接口提供的方法来访问此对象，可以限制访问，隐藏具体实现。<br /><br /><br /></p>
<img src ="http://www.blogjava.net/llxiong/aggbug/36931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-22 22:35 <a href="http://www.blogjava.net/llxiong/archive/2006/03/22/36931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DecimalFormat</title><link>http://www.blogjava.net/llxiong/archive/2006/03/22/36866.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Wed, 22 Mar 2006 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/22/36866.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/36866.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/22/36866.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/36866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/36866.html</trackback:ping><description><![CDATA[  问题一：<br />  有int型数字如下，123，1234，12345，123456，1234567，12345678，123456789<br />  求一个方法，输出123 1,234 12,345 123,456 1,234,567 12,345,678 123,456,789<br /><br />  处理：<br />  public void testPrint(int num) {<br />    DecimalFormat format = new DecimalFormat("#,###");<br />    System.out.println(format.format(num));<br />  }<br /><br /><br /> 问题二、<br />double类型如何正确的转换为字符串类型<br /><br />处理：<br /> double d = 0.001;<br />    DecimalFormat df1 = new DecimalFormat("#.####");<br />    String result = df1.format(d);<br />    System.out.println(result);<img src ="http://www.blogjava.net/llxiong/aggbug/36866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-22 15:53 <a href="http://www.blogjava.net/llxiong/archive/2006/03/22/36866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Singleton模式</title><link>http://www.blogjava.net/llxiong/archive/2006/03/22/36852.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Wed, 22 Mar 2006 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/22/36852.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/36852.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/22/36852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/36852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/36852.html</trackback:ping><description><![CDATA[
		<p>Singleton模式主要作用是保证在Java应用程序中，一个类只有一个实例存在。解释下面的代码是怎么保证只有一个实例的？</p>
		<p>public class Singleton {<br />　　private Singleton(){}<br />　　private static Singleton instance = new Singleton();<br />　　public static Singleton getInstance() {<br />　　return instance;<br />　　}<br />　　}<br /><br />处理：<br /><br /></p>
		<p>因为构造函数是私有的，用户不能自己实例对象 private Singleton(){}<br />而且指向这个唯一的对象的引用也是私有，只能通过getInstance方法返回对象的引用<br />getInstance方法正实现了保证唯一对象的功能</p>
<img src ="http://www.blogjava.net/llxiong/aggbug/36852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-22 14:19 <a href="http://www.blogjava.net/llxiong/archive/2006/03/22/36852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：java的异常处理</title><link>http://www.blogjava.net/llxiong/archive/2006/03/19/36113.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Sun, 19 Mar 2006 14:56:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/19/36113.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/36113.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/19/36113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/36113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/36113.html</trackback:ping><description><![CDATA[
		<table bordercolor="#cbe1ef" cellspacing="0" cellpadding="4" width="98%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="zhengwen">5.1.1·介绍 <br /><br />什么是异常？在Java编程语言中，异常类定义程序中可能遇到的轻微 <br />的错误条件。可以写代码来处理异常并继续程序执行，而不是让程序 <br />中断。在程序执行中，任何中断正常程序流程的异常条件就是错误或 <br />]异常。例如，发生下列情况时，会出现异常： <br />- 想打开的文件不存在 <br />- 网络连接中断 <br />- 受控操作数超出预定范围 <br />- 非常感兴趣地正在装载的类文件丢失 <br /><br />在Java编程语言中，错误类定义被认为是不能恢复的严重错误条件。在 <br />大多数情况下，当遇到这样的错误时，建议让程序中断。Java编程语言 <br />实现C++异常来帮助建立弹性代码。在程序中发生错误时，发现错误的 <br />方法能抛出一个异常到其调用程序，发出已经发生问题的信号。然后， <br />调用方法捕获抛出的异常，在可能时，再恢复回来。这个方案给程序员 <br />一个写处理程序的选择，来处理异常。通过浏览API，可以决定方法抛出 <br />的是什么样的异常。 <br /><br />5.1.2·实例 <br /><br />考虑一下HelloWorld.java程序版本的简单扩展，它通过信息来循环： <br />1. public class HelloWorld { <br />2. public static void main (String args[]) { <br />3. int i = 0; <br />4. <br />5. String greetings [] = { <br />6. "Hello world!", <br />7. "No, I mean it!", <br />8. "HELLO WORLD!!" <br />9. }; <br />10. <br />11. while (i &lt; 4) { <br />12. System.out.println (greetings[i]); <br />13. i++; <br />14. } <br />15. } <br />16. } <br /><br />正常情况下，当异常被抛出时，在其循环被执行四次之后，程序终止，并带有 <br />错误信息，就象前面所示的程序那样。 <br />1. c:\student\&gt; java HelloWorld <br />2. Hello world! <br />3. No, I mean it! <br />4. HELLO WORLD!! <br />5. java.lang.ArrayIndexOutOfBoundsException: 3 <br />6. at HelloWorld.main(HelloWorld.java:12) <br /><br />异常处理允许程序捕获异常，处理它们，然后继续程序执行。它是分层把关， <br />因此，错误情况不会介入到程序的正常流程中。特殊情况发生时，在与正常 <br />执行的代码分离的代码块中被处理。这就产生了更易识别和管理的代码。 <br /><br />5.2·异常处理 <br /><br />Java编程语言提供了一个来考虑哪个异常被抛出以及如何来恢复它的机制。 <br /><br />·try和catch语句 <br /><br />要处理特殊的异常，将能够抛出异常的代码放入try块中，然后创建相应的 <br />catch块的列表，每个可以被抛出异常都有一个。如果生成的异常与catch <br />中提到的相匹配，那么catch条件的块语句就被执行。在try块之后，可能 <br />有许多catch块，每一个都处理不同的异常。 <br />1. try { <br />2. // code that might throw a particular exception <br />3. } catch (MyExceptionType e) { <br />4. // code to execute if a MyExceptionType exception is thrown <br />5. } catch (Exception e) { <br />6. // code to execute if a general Exception exception is thrown <br />7. } <br /><br />5.2.1·调用栈机制 <br /><br />如果方法中的一个语句抛出一个没有在相应的try/catch块中处理的异常， <br />那么这个异常就被抛出到调用方法中。如果异常也没有在调用方法中被处理， <br />它就被抛出到该方法的调用程序。这个过程要一直延续到异常被处理。 <br />如果异常到这时还没被处理，它便回到main()，而且，即使main()不处理它， <br />那么，该异常就异常地中断程序。考虑这样一种情况，在该情况中main() <br />方法调用另一个方法（比如，first()），然后它调用另一个 <br />（比如，second()）。如果在second()中发生异常，那么必须做一个检查 <br />来看看该异常是否有一个catch；如果没有，那么对调用栈（first()）中的 <br />下一个方法进行检查，然后检查下一个（main()）。如果这个异常在该 <br />调用栈上没有被最后一个方法处理，那么就会发生一个运行时错误， <br />程序终止执行。 <br /><br />5.2.2·finally语句 <br /><br />finally语句定义一个总是执行的代码块，而不考虑异常是否被捕获。 <br />下述样板代码来自Frank Yellin弗兰克叶林的白皮书《Java中的低级安全》： <br />1. try { <br />2. startFaucet(); <br />3. waterLawn(); <br />4. } <br />5. finally { <br />6. stopFaucet(); <br />7. } <br /><br />在前面的例子中，即使异常在打开开关或给草地浇水时发生，开关也能被关掉。 <br />try 后面的括号中的代码被称做保护码。如果终止程序的System.exit() <br />方法在保护码内被执行，那么，这是finally语句不被执行的唯一情况。 <br />这就暗示，控制流程能偏离正常执行顺序，比如，如果一个return语句 <br />被嵌入try块内的代码中，那么，finally块中的代码应在return前执行。 <br /><br />5.2.3·重访前例 <br /><br />下面的例子是第169页main()方法的重写。本程序以前的版本中产生的 <br />异常被捕获，数组索引重新设定，使下述程序继续运行。 <br />1. public static void main (String args[]) { <br />2. int i = 0; <br />3. String greetings [] = { <br />4. "Hello world!", <br />5. "No, I mean it!", <br />6. "HELLO WORLD!!" <br />7. }; <br />8. while (i &lt; 4) { <br />9. try { <br />10. System.out.println (greetings[i]); <br />11. } catch (ArrayIndexOutOfBoundsException e){ <br />12. System.out.println( "Re-setting Index Value"); <br />13. i = -1; <br />14. } finally { <br />15. System.out.println("This is always printed"); <br />16. } <br />17. i++; <br />18. } // end while() <br />19. } // end main() <br /><br />当循环被执行时，下述在屏幕上出现的信息将改变。 <br /><br />1. Hello world! <br />2. This is always printed <br />3. No, I mean it! <br />4. This is always printed <br />5. HELLO WORLD!! <br />6. This is always printed <br />7. Re-setting Index Value <br />8. This is always printed <br /><br />5.3·异常分类 <br /><br />在Java编程语言中，异常有三种分类。Java.lang.Throwable类充当所有 <br />对象的父类，可以使用异常处理机制将这些对象抛出并捕获。在Throwable <br />类中定义方法来检索与异常相关的错误信息，并打印显示异常发生的栈 <br />跟踪信息。它有Error和Exception两个基本子类. <br />Throwable类不能使用，而使用子类异常中的一个来描述任何特殊异常。 <br />每个异常的目的描述如下： <br />- Error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说 <br />内存溢出。不可能指望程序能处理这样的情况。 <br />- RuntimeException表示一种设计或实现问题。也就是说，它表示如果 <br />程序运行正常，从不会发生的情况。比如，如果数组索引扩展不超出 <br />数组界限，那么，ArrayIndexOutOfBoundsException异常从不会抛出。 <br />比如，这也适用于取消引用一个空值对象变量。因为一个正确设计和 <br />实现的程序从不出现这种异常，通常对它不做处理。这会导致一个 <br />运行时信息，应确保能采取措施更正问题，而不是将它藏到谁也不 <br />注意的地方。 <br />- 其它异常表示一种运行时的困难，它通常由环境效果引起，可以进行 <br />处理。例子包括文件未找到或无效URL异常（用户打了一个错误的URL）， <br />如果用户误打了什么东西，两者都容易出现。这两者都可能因为用户 <br />错误而出现，这就鼓励程序员去处理它们。 <br /><br />5.4·共同异常 <br /><br />Java编程语言提供几种预定义的异常。下面是可能遇到的更具共同性的 <br />异常中的几种： <br /><br />- ArithmeticException—整数被0除，运算得出的结果。 <br />- int I =12 / 0； <br />- NullPointerException—当对象没被实例化时，访问对象的属性或 <br />方法的尝试： <br />- Date d= null; <br />- System.out.println(d.toString()); <br />- NegativeArraySizeException—创建带负维数大小的数组的尝试。 <br />- ArrayIndexoutofBoundsException—访问超过数组大小范围的一个元 <br />素的尝试。 <br />- SecurityException—典型地被抛出到浏览器中，SecurityManager类将 <br />抛出applets的一个异常，该异常企图做下述工作（除非明显地得到允许）： <br />- 访问一个本地文件 <br />- 打开主机的一个socket，这个主机与服务于applet的主机不是同一个。 <br />- 在运行时环境中执行另一个程序 <br /><br />5.5·处理或声明规则 <br /><br />为了写出健壮的代码，Java编程语言要求，当一个方法在栈（即，它已经被 <br />调用）上发生Exception（它与Error或RuntimeException不同）时，那么， <br />该方法必须决定如果出现问题该采取什么措施。程序员可以做满足该要求 <br />的两件事： <br /><br />第一，通过将Try｛｝catch（）｛｝块纳入其代码中，在这里捕获给被 <br />命名为属于某个超类的异常，并调用方法处理它。即使catch块是空的， <br />这也算是处理情况。 <br />第二，让被调用的方法表示它将不处理异常，而且该异常将被抛回到它所 <br />遇到的调用方法中。它是按如下所示通过用throws子句标记的该调用方法 <br />的声明来实现的： public void troublesome() throws IOException <br />关键字throws之后是所有异常的列表，方法可以抛回到它的调用程序中。 <br />尽管这里只显示了一个异常，如果有成倍的可能的异常可以通过该方法 <br />被抛出，那么，可以使用逗号分开的列表。 <br /><br />是选择处理还是选择声明一个异常取决于是否给你自己或你的调用程序一个 <br />更合适的候选的办法来处理异常。注—由于异常类象其它类一样被组编到 <br />层次中，而且由于无论何时想要使用超类都必须使用子类， 因此，可以 <br />捕获异常“组”并以相同的捕获代码来处理它们。例如，尽管 <br />IOExceptions（EOFException,FileNotFoundException等等） <br />有几种不同的类型，通过俘获IOException，也可以捕获 <br />IOException任何子类的实例。 <br /><br />5.6·创建自己的异常 <br /><br />5.6.1·介绍 <br /><br />用户定义异常是通过扩展Exception类来创建的。这种异常类可以包含 <br />一个“普通”类所包含的任何东西。下面就是一个用户定义异常类例子， <br />它包含一个构造函数、几个变量以及方法： <br /><br />1. public class ServerTimedOutException extends Exception { <br />2. private String reason; <br />3. private int port; <br />4. public ServerTimedOutException (String reason,int port){ <br />5. this.reason = reason; <br />6. this.port = port; <br />7. } <br />8. public String getReason() { <br />9. return reason; <br />10. } <br />11. public int getPort() { <br />12. return port; <br />13. } <br />14. } <br /><br />使用语句来抛出已经创建的异常： <br />throw new ServerTimedOutException <br />("Could not connect", 80); <br /><br />5.6.2·实例 <br /><br />考虑一个客户服务器程序。在客户代码中，要与服务器连接，并希望 <br />服务器在5秒钟内响应。如果服务器没有响应，那么，代码就如下所述 <br />抛出一个异常（如一个用户定义的ServerTimedOutException）。 <br /><br />1. public void connectMe(String serverName) throws <br />ServerTimedOutException { <br />2. int success; <br />3. int portToConnect = 80; <br />4. success = open(serverName, portToConnect); <br />5. if (success == -1) { <br />6. throw new ServerTimedOutException( <br />7. "Could not connect", 80); <br />8. } <br />9. } <br /><br />要捕获异常，使用try语句： <br />1. public void findServer() { <br />2. . . . <br />3. try { <br />4. connectMe(defaultServer); <br />5. } catch(ServerTimedOutException e) { <br />6. System.out.println("Server timed out, trying alternate"); <br />7. try { <br />8. connectMe(alternateServer); <br />9. } catch (ServerTimedOutException e1) { <br />10. System.out.println("No server currently available"); <br />11. } <br />12. } <br />13. .. . <br />注—try和catch块可以如前例所述那样被嵌套。 <br /><br />也可能部分地处理一个异常然后也将它抛出。如： <br />try { <br />..... <br />..... <br />} catch (ServerTimedOutException e) { <br />System.out.println("Error caught "); <br />throw e; <br />} </span>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/llxiong/aggbug/36113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-19 22:56 <a href="http://www.blogjava.net/llxiong/archive/2006/03/19/36113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>抽象类与接口</title><link>http://www.blogjava.net/llxiong/archive/2006/03/19/36071.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Sun, 19 Mar 2006 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/19/36071.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/36071.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/19/36071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/36071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/36071.html</trackback:ping><description><![CDATA[
		<p>abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制，正是由于这两种机制的存在，才赋予了Java强大的面向对象能力。<br />接口：没有提供任何具体实现，可以说是一个极度抽象的类，他允许你创建一个能够被向上转型为不止一种基类型的类，以此来实现多重继承。<br />抽象类：包含一种或多种抽象方法的类，且可以提供具体的实现。定义抽象类后，其他类可以对他进行扩充并且通过实现其中的抽象方法，使用抽象类具体话。<br />Java中的接口和抽象类的区别：接口中没有属性，而且所有的方法都是抽象的，而抽象类可以有属性，而且可以有抽象方法，也可以有实现的方法。但两者都不能被实例话。<br />使用的时候，一个类可以继承多个接口，但只能继承一个抽象类。<br />一、理解抽象类<br />abstract class和interface在Java语言中都是用来进行抽象类（本文中的抽象类并非从abstract class翻译而来，它表示的是一个抽象体，而abstract class为Java语言中用于定义抽象类的一种方法，请读者注意区分）定义的，那么什么是抽象类，使用抽象类能为我们带来什么好处呢？<br />在面向对象的概念中，我们知道所有的对象都是通过类来描绘的，但是反过来却不是这样。并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念，是对一系列看上去不同，但是本质上相同的具体概念的抽象。<br />比如：如果我们进行一个图形编辑软件的开发，就会发现问题领域存在着圆、三角形这样一些具体概念，它们是不同的，但是它们又都属于形状这样一个概念，形状这个概念在问题领域是不存在的，它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念，所以用以表征抽象概念的抽象类是不能够实例化的。<br />在面向对象领域，抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述，但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类，而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体，因此它可以是不允许修改的；同时，通过从这个抽象体派生，也可扩展此模块的行为功能。熟悉OCP的读者一定知道，为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle)，抽象类是其中的关键所在。<br />二、从语法定义层面看abstract class和interface<br />在语法层面，Java语言对于abstract class和interface给出了不同的定义方式，下面以定义一个名为Demo的抽象类为例来说明这种不同。使用abstract class的方式定义Demo抽象类的方式如下：</p>
		<p>abstract class Demo ｛ <br />abstract void method1(); <br />abstract void method2(); <br />… <br />｝</p>
		<p>
				<br />使用interface的方式定义Demo抽象类的方式如下： </p>
		<p>interface Demo { <br />void method1(); <br />void method2(); <br />… <br />}</p>
		<p>
				<br />在abstract class方式中，Demo可以有自己的数据成员，也可以有非abstarct的成员方法，而在interface方式的实现中，Demo只能够有静态的不能被修改的数据成员（也就是必须是static final的，不过在interface中一般不定义数据成员），所有的成员方法都是abstract的。从某种意义上说，interface是一种特殊形式的abstract class。 <br />从编程的角度来看，abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。 <br />首先，abstract class在Java语言中表示的是一种继承关系，一个类只能使用一次继承关系。但是，一个类却可以实现多个interface。也许，这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。 <br />其次，在abstract class的定义中，我们可以赋予方法的默认行为。但是在interface的定义中，方法却不能拥有默认行为，为了绕过这个限制，必须使用委托，但是这会 增加一些复杂性，有时会造成很大的麻烦。 <br />在抽象类中不能定义默认行为还存在另一个比较严重的问题，那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面（一般通过abstract class或者interface来表示）以适应新的情况（比如，添加新的方法或者给已用的方法中添加新的参数）时，就会非常的麻烦，可能要花费很多的时间（对于派生类很多的情况，尤为如此）。但是如果界面是通过abstract class来实现的，那么可能就只需要修改定义在abstract class中的默认行为就可以了。 <br />同样，如果不能在抽象类中定义默认行为，就会导致同样的方法实现出现在该抽象类的每一个派生类中，违反了"one rule，one place"原则，造成代码重复，同样不利于以后的维护。因此，在abstract class和interface间进行选择时要非常的小心。<br />三、从设计理念层面看abstract class和interface <br />上面主要从语法定义和编程的角度论述了abstract class和interface的区别，这些层面的区别是比较低层次的、非本质的。本文将从另一个层面：abstract class和interface所反映出的设计理念，来分析一下二者的区别。作者认为，从这个层面进行分析才能理解二者概念的本质所在。 <br />前面已经提到过，abstarct class在Java语言中体现了一种继承关系，要想使得继承关系合理，父类和派生类之间必须存在"is a"关系，即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然，并不要求interface的实现者和interface定义在概念本质上是一致的，仅仅是实现了interface定义的契约而已。为了使论述便于理解，下面将通过一个简单的实例进行说明。 <br />考虑这样一个例子，假设在我们的问题领域中有一个关于Door的抽象概念，该Door具有执行两个动作open和close，此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型，定义方式分别如下所示： </p>
		<p>使用abstract class方式定义Door： </p>
		<p>abstract class Door { <br />abstract void open(); <br />abstract void close()； <br />} </p>
		<p>使用interface方式定义Door： </p>
		<p>interface Door { <br />void open(); <br />void close(); <br />}</p>
		<p>
				<br />其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。<br />如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢（在本例中，主要是为了展示abstract class和interface反映在设计理念上的区别，其他方面无关的问题都做了简化或者忽略）下面将罗列出可能的解决方案，并从设计理念层面对这些不同的方案进行分析。<br />解决方案一：<br />简单的在Door的定义中增加一个alarm方法，如下：</p>
		<p>abstract class Door { <br />abstract void open(); <br />abstract void close()； <br />abstract void alarm(); <br />} </p>
		<p>
				<br />或者 </p>
		<p>interface Door { <br />void open(); <br />void close(); <br />void alarm(); <br />}</p>
		<p>
				<br />那么具有报警功能的AlarmDoor的定义方式如下： </p>
		<p>class AlarmDoor extends Door { <br />void open() { … } <br />void close() { … } <br />void alarm() { … } <br />} </p>
		<p>
				<br />或者 </p>
		<p>class AlarmDoor implements Door ｛ <br />void open() { … } <br />void close() { … } <br />void alarm() { … } <br />｝</p>
		<p>
				<br />这种方法违反了面向对象设计中的一个核心原则ISP（Interface Segregation Priciple），在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变（比如：修改alarm方法的参数）而改变，反之依然。 <br />解决方案二： <br />既然open、close和alarm属于两个不同的概念，根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有：这两个概念都使用abstract class方式定义；两个概念都使用interface方式定义；一个概念使用abstract class方式定义，另一个概念使用interface方式定义。 <br />显然，由于Java语言不支持多重继承，所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的，但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。 <br />如果两个概念都使用interface方式来定义，那么就反映出两个问题： <br />1、我们可能没有理解清楚问题领域，AlarmDoor在概念本质上到底是Door还是报警器？ <br />2、如果我们对于问题领域的理解没有问题，比如：我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的，那么我们在实现时就没有能够正确的揭示我们的设计意图，因为在这两个概念的定义上（均使用interface方式定义）反映不出上述含义。 <br />如果我们对于问题领域的理解是：AlarmDoor在概念本质上是Door，同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢？前面已经说过，abstract class在Java语言中表示一种继承关系，而继承关系在本质上是"is a"关系。所以对于Door这个概念，我们应该使用abstarct class方式来定义。另外，AlarmDoor又具有报警功能，说明它又能够完成报警概念中定义的行为，所以报警概念可以通过interface方式定义。如下所示： </p>
		<p>abstract class Door { <br />abstract void open(); <br />abstract void close()； <br />} <br />interface Alarm { <br />void alarm(); <br />} <br />class AlarmDoor extends Door implements Alarm { <br />void open() { … } <br />void close() { … } <br />void alarm() { … } <br />}</p>
		<p>
				<br />这种实现方式基本上能够明确的反映出我们对于问题领域的理解，正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系，interface表示的是"like a"关系，大家在选择时可以作为一个依据，当然这是建立在对问题领域的理解上的，比如：如果我们认为AlarmDoor在概念本质上是报警器，同时又具有Door的功能，那么上述的定义方式就要反过来了。 <br />abstract class和interface是Java语言中的两种定义抽象类的方式，它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理，因为它们表现了概念间的不同的关系（虽然都能够实现需求的功能）。这其实也是语言的一种的惯用法，希望读者朋友能够细细体会<br /></p>
<img src ="http://www.blogjava.net/llxiong/aggbug/36071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-19 15:41 <a href="http://www.blogjava.net/llxiong/archive/2006/03/19/36071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebServices概念</title><link>http://www.blogjava.net/llxiong/archive/2006/03/19/36027.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Sun, 19 Mar 2006 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/19/36027.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/36027.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/19/36027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/36027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/36027.html</trackback:ping><description><![CDATA[WebServices 是部署在WEB上的组件和对象!<br />  它具有以下几点特征:<br />   1. 高度的耦合性.就是移植性还不错,相互依赖不强 .<br />   2. 高度的集成性.<br />   3. 完好的封状性. 就是我们只可以看到他想让你看到的东西 呵呵!<br />   4. 使用标准协议规范.<img src ="http://www.blogjava.net/llxiong/aggbug/36027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-19 12:05 <a href="http://www.blogjava.net/llxiong/archive/2006/03/19/36027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对synchronized(this)的一些理解</title><link>http://www.blogjava.net/llxiong/archive/2006/03/18/35901.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Fri, 17 Mar 2006 16:32:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/18/35901.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/35901.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/18/35901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/35901.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/35901.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td style="BORDER-BOTTOM: #ff99ff 1px dashed" align="middle" height="50">
										<strong class="f16">对synchronized(this)的一些理解</strong>
								</td>
						</tr>
						<tr>
								<td align="middle" height="40">
								</td>
								<td style="BORDER-RIGHT: #ff99ff 1px solid" valign="top" rowspan="6"> </td>
						</tr>
						<tr>
								<td height="40">
								</td>
						</tr>
						<tr>
								<td>
										<table class="pagefont" cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<p align="left">一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时，一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 <br /><br />二、然而，当一个线程访问object的一个synchronized(this)同步代码块时，另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。 <br /><br />三、尤其关键的是，当一个线程访问object的一个synchronized(this)同步代码块时，其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 <br /><br />四、第三个例子同样适用其它同步代码块。也就是说，当一个线程访问object的一个synchronized(this)同步代码块时，它就获得了这个object的对象锁。结果，其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 <br /><br />五、以上规则对其它对象锁同样适用. </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/llxiong/aggbug/35901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-18 00:32 <a href="http://www.blogjava.net/llxiong/archive/2006/03/18/35901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java学习过程的一些重点</title><link>http://www.blogjava.net/llxiong/archive/2006/03/18/35898.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Fri, 17 Mar 2006 16:26:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/18/35898.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/35898.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/18/35898.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/35898.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/35898.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td style="BORDER-BOTTOM: #ff99ff 1px dashed" align="middle" height="50">
										<strong class="f16">Java学习过程的一些重点</strong>
								</td>
						</tr>
						<tr>
								<td align="middle" height="40">
								</td>
								<td style="BORDER-RIGHT: #ff99ff 1px solid" valign="top" rowspan="6"> </td>
						</tr>
						<tr>
								<td height="40"> </td>
						</tr>
						<tr>
								<td>
										<table class="pagefont" cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>Java学习过程的一些重点 <br /><br />　　主要说说Java的几大块吧，无法说得很细，因为其实每一块拿出来都能说很多，我就说一下这几块学习的时候的重点或者应该注意的东西。 <br /><br /><br /><br />数值类型： <br /><br />　　虽然是面向对象的语言，但是在使用上数值类型还是必不可少的，如果在C的学习中已经掌握了C的数值计算和转换规则，那我想这里应该没有什么问题，只有两点需要注意：1、14.0这样的浮点常量被认为是double型，只有加上f后缀才是float型的；2、整数常量说起来被认为是int型，但是在编译时，可以认为编译器将其看作能表示该数的最小数值，因此byte b = 100;不会报错。 <br /><br /><br /><br />引用类型： <br /><br />　　我也是从C/C++转过来的，其实所谓引用类型在C++中已有体现，就是传参的时候有一种引用类型，从C来考虑，它就是一个指针，只不过，我们不能对它进行指针上的硬操作。所以这里的重点是：1、Java里所有的对象都是在堆中生成的，所以需要类似指针的东西指向它，那就是引用；2、我们通过引用操作的是引用所指向的对象，除了赋值操作外，应该就没有什么操作是针对引用本身的了，这一点是C的指针与Java的引用区别所在。 <br /><br /><br /><br />类和对象： <br /><br />　　这是一个大块，有很多东西，不展开讲了，就说几个重点：1、类方法、类属性与成员方法、成员属性在加载、初始化、使用上的异同；2、在构造函数中，this()和super()的用法；3、子类的加载过程、初始化过程和构造过程；4、方法的重载和覆写；5、覆写所引出的多态问题。(注意：多态之应用在方法上，对属性没有作用) <br /><br />函数调用的参数传递： <br /><br />　　如果把引用类型所记录的地址值，就看作是引用类型变量的值的话，那么，Java的所有方法调用的时候，都是采用的值传递??数值类型传数值，引用类型传地址。 <br /><br /><br /><br />IO流： <br /><br />　　与C比起来，Java的输入输出，尤其是输入是非常麻烦的，也许是因为出于面向对象的考虑吧？不知道。Java提供了很多的IO流，但是我们并不必将各种IO都搞清楚，我们只需要了解字节流与字符流各有什么功能，字符流是如何在字节流之上构造的，几乎所有的字符流构造的时候都是建立在一个已有的字节流的基础上的，并且它的这种设计使得我们可以像套管子一样，将IO流一节一节套起来，直到得到我们想使用的IO对象(例：BufferedReader的使用)。在我们以后使用的时候，我们可以再去查API，我觉得主要要看的几个类是：FileReader、FileWriter、BufferedReader，再配合上System.out对象，对于文本的输入、输出来说，就足够用了，至于其他的，我觉得不考试的话，没有必要看那么多，用的时候再看了。(我使用Java一年半来，基本上就在使用BufferedReader和System.out) <br /><br /><br /><br />容器： <br /><br />　　个人认为，这是Java编程的一大利器，我最爱用的类是：ArrayList(List)作为可变长数组、HashMap(Map)用来建立查找表，Set我很少用，只在HashMap的使用中连带用过一些。通过对这两个类的熟悉，能够将List、Set和Map三大类的基本用法掌握。另外它的几个辅助类要掌握：Iterator和Collections。Collections类提供容器的一些通用工具，比如排序。而说到排序，就牵扯出了比较器：Comparator。能够熟练使用Comparator类，可以让你为自己的需求和自己的类定制排序方案。 <br /><br /><br /><br />AWT和SWING： <br /><br />　　个人认为，Java在图形界面的制作上有着非常好的封装性，我以前曾经试图学过MFC，MFC在生成图形界面的时候会帮助你生成一些代码，然后让你在这些代码的指定位置添加代码以实现功能，我这个人有个习惯，如果让我看到了一些东西，那么我不搞清除为什么这么写，就不会往下走，看到那许多代码，自然就想弄清楚那些是什么，结果引出来好多知识，后来我才知道其中有些是调用WinAPI，结果我到现在还是不会用MFC。这里并不是贬低MFC，我相信MFC有其过人之处，只不过个人认为它的封装性做得不好，暴露出了太多东西，也许能够提高灵活性，不过，可能我跟它无缘:(。在这方面Java就做得不错，给你一个类，你用就是了，它将图形界面的低层实现隐藏的很好，将其作为一个对象给你，而你只需要在这个对象上修修改改，挺方便的。 <br /><br />　　作为初学者，我觉得AWT的重点在于它的几个Listener的用法，还有布局格式，然后就是那许多的Component的用处和用法。(不过，我觉得，等到用的时候再去找合适的Component进行学习应该也不算太迟 ^_^) <br /><br />　　不过，因为我个人使用的原因，所以至今AWT和SWING都用得很少，所以这方面也就不便多说了，抱歉。写这些并不是告诉大家怎么解决问题，因为每一个都有很多可写，只是希望能给初学者一点参考，希望能够帮助初学者们有的放矢地看书。</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/llxiong/aggbug/35898.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-18 00:26 <a href="http://www.blogjava.net/llxiong/archive/2006/03/18/35898.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBuilder 9 常见快捷键</title><link>http://www.blogjava.net/llxiong/archive/2006/03/18/35895.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Fri, 17 Mar 2006 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/18/35895.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/35895.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/18/35895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/35895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/35895.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td style="BORDER-BOTTOM: #ff99ff 1px dashed" align="middle" height="50">
										<strong class="f16">JBuilder 9 常见快捷键</strong>
								</td>
						</tr>
						<tr>
								<td align="middle" height="40">
								</td>
								<td style="BORDER-RIGHT: #ff99ff 1px solid" valign="top" rowspan="6"> </td>
						</tr>
						<tr>
								<td height="40"> </td>
						</tr>
						<tr>
								<td>
										<table class="pagefont" cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<p align="left">1.工作区: (显隐) <br /><br />项目面板：ctrl + Alt + p (Project) <br />设计面板: ctrl + Alt + c (content) <br />结构面板: ctrl + Alt + s (Structure) <br />信息面板: ctrl + Alt + M (Message) <br />状态面板: ctrl + Alt + Z <br /><br /><br />2.主面板:(代码面板和设计面板) <br /><br />激活代码模块: ctrl + J (@1) <br />参数提示信息的激活: ctrl + shift + H <br />打开查询、替换窗口: ctrl + F <br />类的查询: ctrl + - <br /><br /><br />3.F 键的用法 <br /><br />F1: 帮助快捷 <br />F4: 运行多行 <br />F5: 加入断点 <br />F7: 当遇到方法时会运行方法内的代码 <br />F8: 逐步运行代码 <br />F12: 代码面板和设计面板切换 <br /><br /><br />4. Shift 键的用法 <br /><br />添加多个相同组件： 按shift键在选项上选取组件，把组件添加到窗口即可 <br />调整组件间间隔和对齐： 假设有组件JPanel 1/2/3;(要达到3个组件宽度相同，组件间隔相等，并且都是依据JPanel1左对齐),按shift键，用鼠标选中需要调整的组件，(第一个选中的组件是其他的基准)然后右键。 <br /><br /><br />5: codeInsight 和 Codetemplates <br />MemberInsight -- 根据当前的代码提示可用的类成员或方法(说明) <br />ParameterInsight -- 提示当前的方法需要使用的参数 <br />SymbolInsigh -- 查看当前的变量、方法或者类的愿代码。 <br /><br />MemberInsight: ctrl + space 或 ctrl + H <br />ParameterInsight: ctrl + shift + space 或 ctrl + shift + H <br />SymbolInsight: ctrl + Enter 或 Alt + shift + H <br />ClassInsight : ctrl + alt + space 或 ctrl + alt + H <br /><br /><br /><br /><br />注： (@1)：使用代码功能：(ctrl + J) <br />1、 在想要输入代码的位置输入代码摸板名，然后按 ctrl + J(开发人员可以用主菜单上的Tools/Editor/Templates命令来查看代码摸板的名字) <br />2、把光标定位于想要输入代码的位置，然后按ctrl + J</p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/llxiong/aggbug/35895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-18 00:23 <a href="http://www.blogjava.net/llxiong/archive/2006/03/18/35895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序文件的绝对路径</title><link>http://www.blogjava.net/llxiong/archive/2006/03/17/35891.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Fri, 17 Mar 2006 15:59:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/17/35891.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/35891.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/17/35891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/35891.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/35891.html</trackback:ping><description><![CDATA[1.得到当前程序文件的绝对路径：this.getClass().getResource(this.getClass().getName()+".java").getPath()<img src ="http://www.blogjava.net/llxiong/aggbug/35891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-17 23:59 <a href="http://www.blogjava.net/llxiong/archive/2006/03/17/35891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件优化,硬件升级</title><link>http://www.blogjava.net/llxiong/archive/2006/03/17/35884.html</link><dc:creator>xnabx</dc:creator><author>xnabx</author><pubDate>Fri, 17 Mar 2006 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/llxiong/archive/2006/03/17/35884.html</guid><wfw:comment>http://www.blogjava.net/llxiong/comments/35884.html</wfw:comment><comments>http://www.blogjava.net/llxiong/archive/2006/03/17/35884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/llxiong/comments/commentRss/35884.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/llxiong/services/trackbacks/35884.html</trackback:ping><description><![CDATA[
		<p>关于软件优化,硬件升级方面的:</p>
		<p>至强64位双CPU<br />2G内存 DDR2 533</p>
		<p>tomcat5.5默认配置<br />java5.0默认配置<br />mysql5.0默认配置</p>
		<p>带宽为10M独享.<br />如何改变软件方面的配置要求。优化方面的资料。硬件方面要升级哪些？ 以达到支持大约在线用户为最高2000人。<br /><br />处理：<br />       2000 人在线，每秒钟请求数应该在几百次或者更低些的程度，并发数不会超过100(平均10妙请求一次)，使用普通的 PC 机，每秒钟也能够处理上百次的请求；<br />       缓存优化：解决性能问题首先想到的就是缓存，在 Web 应用中有很多缓存的方式，可以缓存到 Web 层的 servletContext 中，也可以缓存到业务层中，甚至可以在数据库中建立冗余。而生成静态页面是一种极端的做法，一般来说会增加复杂性，同时可能会对灵活性和可维护性造成很大伤害。缓存的要点在于命中率，命中率低的东西不应该缓存，除非对内存的价格不做考虑。总结起来设计上就两句话，使用 N 层结构，合理缓存。根据程序的需要，适当是使用缓存机制；<br />       程序进行优化方法，比如：每次查找部分记录，而不是全部查出来，这样既可以减轻服务器的负担，也可以减少网络传输量； 对于系统中的数据库连接一定要进行妥善的处理； 对需要用 scrchrnozied 的地方要用，但是有些地方可以不用同步化的，这个对速度影响也很大；从代码入手，优化程序，在数据持久化上进行改进，采用成熟的库访问对象（Data Access Object）设计模式也会节省你的服务器开销。<br />       硬件升级：硬件方面还不行，硬盘最好搞阵列，还可以再来一个服务器，弄个负载均衡，由两个服务器来处理用户的请求，apache必然是要用到的，他将挡在tomcat前处理http请求。<br />       注意：在硬件足够强大的时候，将 web 与 db 分两台服务器来做，只会降低效率，因为网络编组的成本要比本地内存中的复制高几个数量级。同样道理，负载均衡也只会导致更复杂的结构，会引起更多的问题，并产生更低于下的效率。将一个应用分布于多台机器的唯一理由，就是由于一台机器根本顶不住，不得不分。<br />       环境优化：调Tomcat、JVM的Heap大小等参数做一些优化， Tomcat的虚拟内存管理有最大值限制，可以并发运行多个Tomcat来均衡负载，tomcat5.5默认配置  ==&gt;改了JAVA_OPTS没有？开大内存 既java_opts= -Xms1024m -Xmx1024m ；  java5.0默认配置    ==&gt;升级一下到最大的小版本6.0 升级处理<br />      系统内存测试：<br />     （1）自己测试：参考tomcat,jvm,mysql优化方面的资料。测试如下操作出错：<br />C:\&gt;java -Xms536870932 -Xmx536870912<br />Error occurred during initialization of VM<br />Incompatible initial and maximum heap sizes specified至强64位双CPU，原则上面来说64位的CPU应当可以用到无限大的内存了，也还是理论上的了。可以java -Xmx2000M -version这样一路加上去试试看你的可以加到多大。<br />     （2）工具测试：  压力测试：对应用系统进行性能采样于监控，（Wily有一套产品可以在运行期进行调优，但我没有用过），我用的P6Spy，加MS的那个压力测试工具，也有D用LoadRunner来跑一跑，在SQL语句这个地方有太多的名堂可做了。<br />       建议软件方面：<br />       a、软件配置 Apache2.2.0 + mod_ajp + jrockit-R26.0.0-jdk1.5.0_04+  Tomcat5.5.15 (启多个)+apr1.2.2 .<br />       b、内存建议4g以上 。 tomcat的内存参数使用 set JAVA_OPTS=%JAVA_OPTS%-Xms1024m -Xmx1024m  (内存2g的话，建议set JAVA_OPTS=%JAVA_OPTS%-Xms512m -Xmx512m).<br />      c、tomcat5.5版本的性能已经大幅度提高了。</p>
		<p>
				<br />     <br />   <br /></p>
<img src ="http://www.blogjava.net/llxiong/aggbug/35884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/llxiong/" target="_blank">xnabx</a> 2006-03-17 23:29 <a href="http://www.blogjava.net/llxiong/archive/2006/03/17/35884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>