<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>小熊 &#187; Java</title>
	<atom:link href="http://ringtail.xmulib.org/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://ringtail.xmulib.org</link>
	<description>爱睡懒觉的小熊</description>
	<lastBuildDate>Sun, 04 Jul 2010 03:00:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>字符串编码转换小结1</title>
		<link>http://ringtail.xmulib.org/2008/05/05/%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%bc%96%e7%a0%81%e8%bd%ac%e6%8d%a2%e5%b0%8f%e7%bb%931/</link>
		<comments>http://ringtail.xmulib.org/2008/05/05/%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%bc%96%e7%a0%81%e8%bd%ac%e6%8d%a2%e5%b0%8f%e7%bb%931/#comments</comments>
		<pubDate>Mon, 05 May 2008 02:44:07 +0000</pubDate>
		<dc:creator>ringtail</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://ringtail.xmulib.org/2008/05/05/%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%bc%96%e7%a0%81%e8%bd%ac%e6%8d%a2%e5%b0%8f%e7%bb%931/</guid>
		<description><![CDATA[java中的字符串编码转换
]]></description>
			<content:encoded><![CDATA[<p>&nbsp;基础：<br />
<h3><a href="http://www.eygle.com/digest/2007/01/zhs16gbk_char.html">中文编码基础知识介绍</a>(理论基础)</h3>
<h3><a href="http://www.ibm.com/developerworks/cn/java/java_chinese/">Java 编程技术中汉字问题的分析及解决</a></h3>
<h3><a href="http://www.javazy.com/contentex/200576161453.shtml">String.getBytes()方法中的中文编码问题</a> （这篇最为简单易懂且结合实际）</h3>
<h3><a href="http://www.bcexe.com/show.asp?newsid=15768">Unicode和UTF-8之间的转换详解</a></h3>
<h3>附录：</h3>
<h3><a href="http://tieba.baidu.com/f?kz=67059623"><font color="#0000cc">unicode编码表</font></a></h3>
<h3><font color="#ff0000"><b><a href="http://219.136.187.225/SchoolWeb/hzdwzx/xxzy/xxzy-kj/xxzy-xx/xxzy-xx1/xxzy-xx1-1/HAIZI/GBK2.htm" name="GBK">GBK<br />
汉字内码扩展规范</a>编码表(二)</b></font></h3>
<p>代码示例：</p>
<p>public String changeCharset(String str)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throws UnsupportedEncodingException {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (str != null) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //得到gbk编码的字节串<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;byte[] bs = str.getBytes(&#8221;GBK&#8221;);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(&#8221;gbk:&#8221;);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(&#8221;hex format is:&#8221;+encodeHex(bs)); <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; //得到utf8编码的字节串&nbsp;  <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;byte[] ns = str.getBytes(&#8221;UTF-8&#8243;);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&#8221;utf8:&#8221;);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(&#8221;hex format is:&#8221;+encodeHex(ns)); <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(&#8221;Bin format is:&#8221;+encodeBin(ns)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;  //将编码为utf8的字节串再生成新的字符串，然后解码，看看转换过程中是否出错<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String newutf=new String(ns,&#8221;UTF-8&#8243;);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(&#8221;convert back from utf8:&#8221;+encodeHex(newutf.getBytes(&#8221;UTF-8&#8243;)));<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return newutf;<br />}</p>
<p>public static final String encodeHex (byte[] bytes)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer buff = <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; new StringBuffer(bytes.length * 2); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String b; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=0; i&lt;bytes.length ; i++) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = Integer.toHexString(bytes[i]);&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // byte是两个字节的， 而上面的Integer.toHexString会把字节扩展为4个字节 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buff.append(b.length() &gt; 2 ? b.substring(6,8) : b);&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buff.append(&#8221; &#8220;); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return buff.toString(); <br />&nbsp;&nbsp;&nbsp; } <br />public static final String encodeBin (byte[] bytes)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer buff = <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; new StringBuffer(bytes.length * 2); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String b; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=0; i&lt;bytes.length ; i++) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = Integer.toBinaryString(bytes[i]);&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // byte是两个字节的， 而上面的Integer.toHexString会把字节扩展为4个字节 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buff.append(b.substring(24,b.length()));&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buff.append(&#8221; &#8220;); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return buff.toString(); <br />&nbsp;&nbsp;&nbsp; } </p>
<p>在Java中，String.getBytes(&#8221;GBK&#8221;)获得的是gbk编码的字节串，打印出来之后得到的是对应编码的十进制值，转换成16进制后就和编码表中的值一样了。<br />最后可以根据输出的二进制编码，和unicode表对比。</p>
<p>示例：<br />str: 中国<br />gbk:<br />hex format is:d6 d0 b9 fa <br />utf8: <br />hex format is:e4 b8 ad e5 9b bd <br />Bin format is:11100100 10111000 10101101 11100101 10011011 10111101 <br />convert back from utf8:e4 b8 ad e5 9b bd <br />其中，“中”的unicode编码是4e2d，二进制表示为0100 1110 0010 1101，从低位到高位按六位截取及补齐高位后就可以得到11100100 10111000 1010110 ，即为utf8编码。</p>
<p><a href="http://tieba.baidu.com/f?kz=67059623"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://ringtail.xmulib.org/2008/05/05/%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%bc%96%e7%a0%81%e8%bd%ac%e6%8d%a2%e5%b0%8f%e7%bb%931/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java 线程一 基础 (转载)</title>
		<link>http://ringtail.xmulib.org/2006/12/12/java-%e7%ba%bf%e7%a8%8b%e4%b8%80-%e5%9f%ba%e7%a1%80-%e8%bd%ac%e8%bd%bd/</link>
		<comments>http://ringtail.xmulib.org/2006/12/12/java-%e7%ba%bf%e7%a8%8b%e4%b8%80-%e5%9f%ba%e7%a1%80-%e8%bd%ac%e8%bd%bd/#comments</comments>
		<pubDate>Tue, 12 Dec 2006 03:20:14 +0000</pubDate>
		<dc:creator>ringtail</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://ringtail.xmulib.org/2006/12/12/java-%e7%ba%bf%e7%a8%8b%e4%b8%80-%e5%9f%ba%e7%a1%80-%e8%bd%ac%e8%bd%bd/</guid>
		<description><![CDATA[线程可以共享地址空间。
下面为java实现线程的两种方法，以及启动线程、停止线程、同步线程和线程间通信的Java实现方法。不涉及线程基本理论的讨论。
参考页面：
http://www.3lian.com/zl/2004/10-5/222237.html
http://www.itisedu.com/phrase/200603091754305.html
http://www.javafan.net/article/20040426165025144.html
Java线程要点：
http://www.jdon.com/concurrent/thread.htm
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=126&#38;threadID=19439&#38;tstart=0

线程基础：
线程（thread）是&#34;进程&#34;中某个单一顺序的控制流。
也被称为轻量进程（lightweight processes）。计算机科学术语，指运行中的程序的调度单位。
&#160; 线程是进程中的实体，一个进程可以拥有多个线程，一个线程必须有一个父进程。
线程不拥有系统资源，只有运行必须的一些数据结构；它与父进程的其它线程共享该进程所拥有的全部资源。
线程可以创建和撤消线程，从而实现程序的并发执行。一般，线程具有就绪、阻塞和运行三种基本状态。
&#160; 在多中央处理器的系统里，不同线程可以同时在不同的中央处理器上运行，甚至当它们属于同一个进程时
也是如此。大多数支持多处理器的操作系统都提供编程接口来让进程可以控制自己的线程与各处理器之间
的关联度（affinity）。
&#160;&#160; 有时候，线程也称作轻量级进程。就象进程一样，线程在程序中是独立的、并发的执行路径，
每个线程&#160; 有它自己的堆栈、自己的程序计数器和自己的局部变量。
但是，与分隔的进程相比，进程中的线程之间的隔离程度要小。
它们共享内存、文件句柄和其它每个进程应有的状态。
&#160;&#160;&#160; 进程可以支持多个线程，它们看似同时执行，但互相之间并不同步。
一个进程中的多个线程共享相同的内存地址空间，这就意味着它们可以访问相同的变量和对象，
而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更容易，
但您必须小心，确保它们不会妨碍同一进程里的其它线程。
&#160;&#160; 一个程序或进程能够包含多个线程，这些线程可以根据程序的代码执行相应的指令。
多线程看上去似乎在并行执行它们各自的工作，就像在一台计算机上运行着多个处理机一样。
在多处理机计算机上实现多线程时，它们确实可以并行工作。
和进程不同的是，线程共享地址空间。也就是说，多个线程能够读写相同的变量或数据结构。
&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;
以上总之一句话，线程可以共享地址空间。
下面为java实现线程的两种方法，以及启动线程、停止线程、同步线程和线程间通信的Java实现方法。
不涉及线程基本理论的讨论。
&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;
在Java中实现一个线程有两种方法，第一是实现Runnable接口实现它的run()方法，第二种是继承Thread类，覆盖它的run()方法。下面是代码示例：

&#160;　　public class DoSomething implements Runnable {
public void run(){
// here is where you do something
}
}
public class DoAnotherThing extends Thread {
public void run(){
// here is where you do something
}
}

这两种方法的区别是，如果你的类已经继承了其它的类，那么你只能选择实现Runnable接口了，因为Java只允许单继承的。
Java中的线程有四种状态分别是：运行、就绪、挂起、结束。如果一个线程结束了也就说明他是一个死线程了。当你调用一个线程实例的start()的方法的时候，这个时候线程进入就绪状态，注意并不是运行状态，当虚拟机开始分配给他CPU的运行时间片的时候线程开始进入运行状态，当线程进入等待状态，例如等待某个事件发生的时候，这时候线程处于挂起状态。
启动一个线程你只需要调用start()方法，针对两种实现线程的方法也有两种启动线程的方法，分别如下：

&#160;　　DoSomething doIt = new DoSomething();
Thread myThread = new Thread( doIt );
myThread.start();
DoAnotherThing doIt = new DoAnotherThing();
doIt.start();
&#160;

由于安全等因素Thread中的stop()方法已经不推荐使用了，因此如果你想要停止一个线程的时候可以通过设置一个信号量，例如：

&#160;　　public class MyThread implements Runnable {
private boolean quit [...]]]></description>
			<content:encoded><![CDATA[<p>线程可以共享地址空间。<br />
下面为java实现线程的两种方法，以及启动线程、停止线程、同步线程和线程间通信的Java实现方法。不涉及线程基本理论的讨论。<br />
参考页面：<br />
http://www.3lian.com/zl/2004/10-5/222237.html<br />
http://www.itisedu.com/phrase/200603091754305.html<br />
http://www.javafan.net/article/20040426165025144.html</p>
<p>Java线程要点：<br />
http://www.jdon.com/concurrent/thread.htm<br />
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=126&amp;threadID=19439&amp;tstart=0</p>
<p><span id="more-24"></span><br />
线程基础：</p>
<p>线程（thread）是&quot;进程&quot;中某个单一顺序的控制流。<br />
也被称为轻量进程（lightweight processes）。计算机科学术语，指运行中的程序的调度单位。</p>
<p>&nbsp; 线程是进程中的实体，一个进程可以拥有多个线程，一个线程必须有一个父进程。<br />
线程不拥有系统资源，只有运行必须的一些数据结构；它与父进程的其它线程共享该进程所拥有的全部资源。<br />
线程可以创建和撤消线程，从而实现程序的并发执行。一般，线程具有就绪、阻塞和运行三种基本状态。</p>
<p>&nbsp; 在多中央处理器的系统里，不同线程可以同时在不同的中央处理器上运行，甚至当它们属于同一个进程时<br />
也是如此。大多数支持多处理器的操作系统都提供编程接口来让进程可以控制自己的线程与各处理器之间<br />
的关联度（affinity）。</p>
<p>&nbsp;&nbsp; 有时候，线程也称作轻量级进程。就象进程一样，线程在程序中是独立的、并发的执行路径，<br />
每个线程&nbsp; 有它自己的堆栈、自己的程序计数器和自己的局部变量。<br />
但是，与分隔的进程相比，进程中的线程之间的隔离程度要小。<br />
它们共享内存、文件句柄和其它每个进程应有的状态。</p>
<p>&nbsp;&nbsp;&nbsp; 进程可以支持多个线程，它们看似同时执行，但互相之间并不同步。<br />
一个进程中的多个线程共享相同的内存地址空间，这就意味着它们可以访问相同的变量和对象，<br />
而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更容易，<br />
但您必须小心，确保它们不会妨碍同一进程里的其它线程。</p>
<p>&nbsp;&nbsp; 一个程序或进程能够包含多个线程，这些线程可以根据程序的代码执行相应的指令。<br />
多线程看上去似乎在并行执行它们各自的工作，就像在一台计算机上运行着多个处理机一样。<br />
在多处理机计算机上实现多线程时，它们确实可以并行工作。<br />
和进程不同的是，线程共享地址空间。也就是说，多个线程能够读写相同的变量或数据结构。</p>
<p>&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;<br />
以上总之一句话，线程可以共享地址空间。<br />
下面为java实现线程的两种方法，以及启动线程、停止线程、同步线程和线程间通信的Java实现方法。<br />
不涉及线程基本理论的讨论。<br />
&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;</p>
<p>在Java中实现一个线程有两种方法，第一是实现Runnable接口实现它的run()方法，第二种是继承Thread类，覆盖它的run()方法。下面是代码示例：</p>
<p>
&nbsp;　　public class DoSomething implements Runnable {<br />
public void run(){<br />
// here is where you do something<br />
}<br />
}<br />
public class DoAnotherThing extends Thread {<br />
public void run(){<br />
// here is where you do something<br />
}<br />
}</p>
<p>
这两种方法的区别是，如果你的类已经继承了其它的类，那么你只能选择实现Runnable接口了，因为Java只允许单继承的。</p>
<p>Java中的线程有四种状态分别是：运行、就绪、挂起、结束。如果一个线程结束了也就说明他是一个死线程了。当你调用一个线程实例的start()的方法的时候，这个时候线程进入就绪状态，注意并不是运行状态，当虚拟机开始分配给他CPU的运行时间片的时候线程开始进入运行状态，当线程进入等待状态，例如等待某个事件发生的时候，这时候线程处于挂起状态。</p>
<p>启动一个线程你只需要调用start()方法，针对两种实现线程的方法也有两种启动线程的方法，分别如下：</p>
<p>
&nbsp;　　DoSomething doIt = new DoSomething();<br />
Thread myThread = new Thread( doIt );<br />
myThread.start();<br />
DoAnotherThing doIt = new DoAnotherThing();<br />
doIt.start();<br />
&nbsp;</p>
<p>
由于安全等因素Thread中的stop()方法已经不推荐使用了，因此如果你想要停止一个线程的时候可以通过设置一个信号量，例如：</p>
<p>
&nbsp;　　public class MyThread implements Runnable {<br />
private boolean quit = false;<br />
public void run(){<br />
while( !quit ){<br />
// do something<br />
}<br />
}</p>
<p>public void quit(){<br />
quit = true;<br />
}<br />
}<br />
&nbsp;</p>
<p>如果每个线程只做它自己的事情，那么就很简单了，但是有的时候几个线程可能要同时访问一个对象并可能对它进行修改，这个时候你必须使用线程的同步在方法或者代码块使用关键字synchronized，例如：</p>
<p>
&nbsp;　　public class Counter {<br />
private int counter;<br />
public synchronized int increment(){<br />
return ++counter;<br />
}</p>
<p>public synchronized int decrement(){<br />
if( &#8211;counter &lt; 0 ){<br />
counter = 0;<br />
}</p>
<p>return counter;<br />
}<br />
}<br />
&nbsp;</p>
<p>
每个java对象都可以最为一个监视器，当线程访问它的synchronized方法的时候，他只允许在一个时间只有一个线程对他访问，让其他得线程排队等候。这样就可以避免多线程对共享数据造成破坏。记住synchronized是会耗费系统资源降低程序执行效率的，因此一定要在需要同步的时候才使用，尤其在J2ME的开发中要小心。</p>
<p>如果你要是想让线程等待某个事件的发生然后继续执行的话，那么这就涉及到线程的调度了。在java中通过wait ()，notify(),notifyAll()来实现，这三个方法是在Object类中定义的，当你想让线程挂起的时候调用obj.wait()方法，在同样的obj上调用notify()则让线程重新开始运行。　最后以SUN提供的Producer/Consumer的例子来结束这篇文章，内容是 Producer产生一个数字而Consumer消费这个数字，这个小程序里面基本覆盖了本文所有的知识点。请详细研究一下代码</p>
<p>
&nbsp;　　public class Producer extends Thread {<br />
private CubbyHole cubbyhole;<br />
private int number;<br />
public Producer(CubbyHole c, int number) {<br />
cubbyhole = c;<br />
this.number = number;<br />
}</p>
<p>public void run() {<br />
for (int i = 0; i &lt; 10; i++) {<br />
cubbyhole.put(i);<br />
System.out.println(&quot;Producer #&quot; + this.number<br />
+ &quot; put: &quot; + i);<br />
try {<br />
sleep((int)(Math.random() * 100));<br />
} catch (InterruptedException e) { }<br />
}<br />
}<br />
}<br />
&nbsp;</p>
<p>public class CubbyHole {<br />
private int contents;<br />
private boolean available = false;</p>
<p>public synchronized int get() {<br />
while (available == false) {<br />
try {<br />
wait();<br />
} catch (InterruptedException e) { }<br />
}<br />
available = false;<br />
notifyAll();<br />
return contents;<br />
}</p>
<p>public synchronized void put(int value) {<br />
while (available == true) {<br />
try {<br />
wait();<br />
} catch (InterruptedException e) { }<br />
}<br />
contents = value;<br />
available = true;<br />
notifyAll();<br />
}<br />
}</p>
<p>public class Consumer extends Thread {<br />
private CubbyHole cubbyhole;<br />
private int number;</p>
<p>public Consumer(CubbyHole c, int number) {<br />
cubbyhole = c;<br />
this.number = number;<br />
}</p>
<p>public void run() {<br />
int value = 0;<br />
for (int i = 0; i &lt; 10; i++) {<br />
value = cubbyhole.get();<br />
System.out.println(&quot;Consumer #&quot; + this.number<br />
+ &quot; got: &quot; + value);<br />
}<br />
}<br />
}<br />
public class ProducerConsumerTest {<br />
public static void main(String[] args) {<br />
CubbyHole c = new CubbyHole();<br />
Producer p1 = new Producer(c, 1);<br />
Consumer c1 = new Consumer(c, 1);</p>
<p>p1.start();<br />
c1.start();<br />
}<br />
}</p>
<p>SUN说输出的结果应该是如下形式，但是在我的机器上却不是这样的，做了一些改动才正确，有兴趣的朋友可以运行一下看看结果，欢迎和我讨论一下！</p>
<p>
&nbsp;　　Producer #1 put: 0<br />
Consumer #1 got: 0<br />
Producer #1 put: 1<br />
Consumer #1 got: 1<br />
Producer #1 put: 2<br />
Consumer #1 got: 2<br />
Producer #1 put: 3<br />
Consumer #1 got: 3<br />
Producer #1 put: 4<br />
Consumer #1 got: 4<br />
Producer #1 put: 5<br />
Consumer #1 got: 5<br />
Producer #1 put: 6<br />
Consumer #1 got: 6<br />
Producer #1 put: 7<br />
Consumer #1 got: 7<br />
Producer #1 put: 8<br />
Consumer #1 got: 8<br />
Producer #1 put: 9<br />
Consumer #1 got: 9</p>
]]></content:encoded>
			<wfw:commentRss>http://ringtail.xmulib.org/2006/12/12/java-%e7%ba%bf%e7%a8%8b%e4%b8%80-%e5%9f%ba%e7%a1%80-%e8%bd%ac%e8%bd%bd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Linux 下安装jdk</title>
		<link>http://ringtail.xmulib.org/2006/12/07/linux-%e4%b8%8b%e5%ae%89%e8%a3%85jdk/</link>
		<comments>http://ringtail.xmulib.org/2006/12/07/linux-%e4%b8%8b%e5%ae%89%e8%a3%85jdk/#comments</comments>
		<pubDate>Thu, 07 Dec 2006 02:08:21 +0000</pubDate>
		<dc:creator>ringtail</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://ringtail.xmulib.org/2006/12/07/linux-%e4%b8%8b%e5%ae%89%e8%a3%85jdk/</guid>
		<description><![CDATA[第一步 ，下载jdk
地址：http://java.sun.com/javase/downloads/index.jsp
选择jdk5.0
第二步，安装
根据下载的不同，有两种安装方法。
如果是rpm.bin文件，则按照下面的方法：先将jdkxxx.bin拷贝到当前目录(/home/hd/java)下，然后执行下面的命令
#chmod a+x jdkxxxx.bin
#./jdkxxxx.bin
然后得到一个rpm文件，继续下面的执行
rpm -i &#8211;badreloc &#8211;relocate /usr/java=/home/hd/java jdk-1_5_0_10-linux-i586.rpm
执行完后，安装并配置环境变量。
如果直接下载bin的安装包，
则直接进行安装，然后配置环境变量
第三步，环境变量设置，
在终端中输入命令
&#160;&#160; vi /etc/profile.d/java.sh
&#160;&#160; 这样可以在所有的用户中使用
&#160;&#160; 在新的java.sh中输入以下内容：
&#160;&#160; #set java environment
&#160;&#160; export JAVA_HOME=/home/hd/java/jdk1.5.0_10;/home/hd/class
&#160;&#160; export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
&#160;&#160; export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
&#160; 其中，/home/hd/class是即将运行class的位置。
]]></description>
			<content:encoded><![CDATA[<p>第一步 ，下载jdk<br />
地址：http://java.sun.com/javase/downloads/index.jsp<br />
选择jdk5.0<br />
第二步，安装<br />
根据下载的不同，有两种安装方法。</p>
<p>如果是rpm.bin文件，则按照下面的方法：先将jdkxxx.bin拷贝到当前目录(/home/hd/java)下，然后执行下面的命令<br />
#chmod a+x jdkxxxx.bin<br />
#./jdkxxxx.bin<br />
然后得到一个rpm文件，继续下面的执行<br />
rpm -i &#8211;badreloc &#8211;relocate /usr/java=/home/hd/java jdk-1_5_0_10-linux-i586.rpm<br />
执行完后，安装并配置环境变量。</p>
<p>如果直接下载bin的安装包，<br />
则直接进行安装，然后配置环境变量</p>
<p>第三步，环境变量设置，<br />
在终端中输入命令<br />
&nbsp;&nbsp; vi /etc/profile.d/java.sh<br />
&nbsp;&nbsp; 这样可以在所有的用户中使用<br />
&nbsp;&nbsp; 在新的java.sh中输入以下内容：<br />
&nbsp;&nbsp; #set java environment<br />
&nbsp;&nbsp; export JAVA_HOME=/home/hd/java/jdk1.5.0_10;/home/hd/class<br />
&nbsp;&nbsp; export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib<br />
&nbsp;&nbsp; export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH<br />
&nbsp; 其中，/home/hd/class是即将运行class的位置。</p>
]]></content:encoded>
			<wfw:commentRss>http://ringtail.xmulib.org/2006/12/07/linux-%e4%b8%8b%e5%ae%89%e8%a3%85jdk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>测试页面连通</title>
		<link>http://ringtail.xmulib.org/2006/12/04/%e6%b5%8b%e8%af%95%e9%a1%b5%e9%9d%a2%e8%bf%9e%e9%80%9a/</link>
		<comments>http://ringtail.xmulib.org/2006/12/04/%e6%b5%8b%e8%af%95%e9%a1%b5%e9%9d%a2%e8%bf%9e%e9%80%9a/#comments</comments>
		<pubDate>Mon, 04 Dec 2006 03:05:43 +0000</pubDate>
		<dc:creator>ringtail</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://ringtail.xmulib.org/2006/12/04/%e6%b5%8b%e8%af%95%e9%a1%b5%e9%9d%a2%e8%bf%9e%e9%80%9a/</guid>
		<description><![CDATA[测试一个页面的连接是否成功，可以通过连接的返回值来判断：
try {
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; boolean fail=true;
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; URL url = new URL(urlString);
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; HttpURLConnection conn = (HttpURLConnection) url.openConnection();
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; int a=conn.getResponseCode();
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; if(a==200){
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; fail=false;
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; }else{
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; fail=true;
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; }
&#160;&#160;&#160; &#160;&#160;&#160; 
&#160;&#160;&#160; &#160;&#160;&#160; } catch (IOException e) {
&#160;&#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>测试一个页面的连接是否成功，可以通过连接的返回值来判断：</p>
<p>try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; boolean fail=true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; URL url = new URL(urlString);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HttpURLConnection conn = (HttpURLConnection) url.openConnection();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int a=conn.getResponseCode();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(a==200){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fail=false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fail=true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fail=true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;连接:&quot; + urlString + &quot;&nbsp; 时错误,Cause:&quot; + e.getMessage());<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p>如果返回值不为200，则连接失败，如果不能建立连接也算失败。即不能连接到该页面。<br />
使用了HttpURLConnection的 int getResponseCode()方法。(Gets the status code from an HTTP response message.)<br />
&nbsp;***********<br />
以下为PHP的实现方法：<br />
1.安装pear<br />
2.安装pear的类库：<br />
HTTP_Client<br />
3.修改php.ini文件中的include_path，设置include_path =&quot;.;C:\PHP\PEAR&quot;;<br />
重启Apache<br />
4.代码如下：<br />
$url=&quot;http://210.34.4.20&quot;;<br />
$client&nbsp; = new HTTP_Client(array(&#8217;allowRedirects&#8217; =&gt; false));<br />
$client-&gt;head($url);<br />
$res = $client-&gt;currentResponse();<br />
echo $res['code'];<br />
从而得到header的返回值，然后判断网页是否连通。</p>
<p>参考资料：<br />
<font size="2">&nbsp;<a href="http://www.google.cn/support/webmasters/bin/answer.py?answer=40132">HTTP 状态码表示什么意思？</a></font></p>
]]></content:encoded>
			<wfw:commentRss>http://ringtail.xmulib.org/2006/12/04/%e6%b5%8b%e8%af%95%e9%a1%b5%e9%9d%a2%e8%bf%9e%e9%80%9a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利用Java API校验和解析XML</title>
		<link>http://ringtail.xmulib.org/2006/11/30/%e5%88%a9%e7%94%a8java-api%e6%a0%a1%e9%aa%8c%e5%92%8c%e8%a7%a3%e6%9e%90xml/</link>
		<comments>http://ringtail.xmulib.org/2006/11/30/%e5%88%a9%e7%94%a8java-api%e6%a0%a1%e9%aa%8c%e5%92%8c%e8%a7%a3%e6%9e%90xml/#comments</comments>
		<pubDate>Thu, 30 Nov 2006 03:00:27 +0000</pubDate>
		<dc:creator>ringtail</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://ringtail.xmulib.org/2006/11/30/%e5%88%a9%e7%94%a8java-api%e6%a0%a1%e9%aa%8c%e5%92%8c%e8%a7%a3%e6%9e%90xml/</guid>
		<description><![CDATA[前段时间因为使用到java进行xml的解析和校验，现在做一个小小的总结：

使用JDOM校验： 
但是由于JDOM没有自己的解析器，它使用标准的解析器(如Xerces)来完成这个工作。如果想要进行schema校验必须确保选择了支持这个schema的解析器。
代码如下：
SAXBuilder builder =
&#160; new SAXBuilder(&#34;org.apache.xerces.parsers.SAXParser&#34;, true);
builder.setFeature(
&#160; &#34;http://apache.org/xml/features/validation/schema&#34;, true);
builder.setProperty(
&#160; &#34;http://apache.org/xml/properties/schema/external-schemaLocation&#34;,
&#160; &#34;http://www.w3.org/2001/12/soap-envelope soap-envelope.xsd&#34; + &#34; &#34; +
&#160; &#34;http://kevinj.develop.com/weblog/weblog.xsd weblog.xsd&#34;);
Document doc = builder.build(xml);
如果你想要使用JAXP来选择解析器，可以跳过指定类到SAXBuilder结构和用&#34;org.apache.xerces.jaxp.SAXParserFactoryImpl&#34;代替&#34; javax.xml.parsers.SAXParserFactory&#34;作为系统属性。这就告诉JAXP使用Xerces的 factory来创建解析器。可以用命令行来指定这个属性：
java -Djavax.xml.parsers.SAXParserFactory=
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; org.apache.xerces.jaxp.SAXParserFactoryImpl 
 以上内容摘自http://www.jdom.org/docs/faq.html&#160;&#160; How do I validate against a schema when using JDOM?
使用JAXP进行校验：
代码如下：
&#160;&#160;&#160; // 1. Lookup a factory for the W3C XML Schema language
&#160;&#160;&#160;&#160;&#160;&#160;&#160; SchemaFactory factory = 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; SchemaFactory.newInstance(&#34;http://www.w3.org/2001/XMLSchema&#34;);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; // [...]]]></description>
			<content:encoded><![CDATA[<p>前段时间因为使用到java进行xml的解析和校验，现在做一个小小的总结：<br />
<strong><br />
使用JDOM校验：</strong> </p>
<p>但是由于JDOM没有自己的解析器，它使用标准的解析器(如Xerces)来完成这个工作。如果想要进行schema校验必须确保选择了支持这个schema的解析器。<br />
代码如下：<br />
SAXBuilder builder =<br />
&nbsp; new SAXBuilder(&quot;org.apache.xerces.parsers.SAXParser&quot;, true);<br />
builder.setFeature(<br />
&nbsp; &quot;http://apache.org/xml/features/validation/schema&quot;, true);<br />
builder.setProperty(<br />
&nbsp; &quot;http://apache.org/xml/properties/schema/external-schemaLocation&quot;,<br />
&nbsp; &quot;http://www.w3.org/2001/12/soap-envelope soap-envelope.xsd&quot; + &quot; &quot; +<br />
&nbsp; &quot;http://kevinj.develop.com/weblog/weblog.xsd weblog.xsd&quot;);<br />
Document doc = builder.build(xml);</p>
<p>如果你想要使用JAXP来选择解析器，可以跳过指定类到SAXBuilder结构和用&quot;org.apache.xerces.jaxp.SAXParserFactoryImpl&quot;代替&quot; javax.xml.parsers.SAXParserFactory&quot;作为系统属性。这就告诉JAXP使用Xerces的 factory来创建解析器。可以用命令行来指定这个属性：<br />
java -Djavax.xml.parsers.SAXParserFactory=<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.xerces.jaxp.SAXParserFactoryImpl </p>
<p><strong> 以上内容摘自</strong>http://www.jdom.org/docs/faq.html&nbsp;&nbsp; How do I validate against a schema when using JDOM?<strong></p>
<p>使用JAXP进行校验：</strong></p>
<p>代码如下：<br />
&nbsp;&nbsp;&nbsp; // 1. Lookup a factory for the W3C XML Schema language<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SchemaFactory factory = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SchemaFactory.newInstance(&quot;http://www.w3.org/2001/XMLSchema&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 2. Compile the schema. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Here the schema is loaded from a java.io.File, but you could use <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // a java.net.URL or a javax.xml.transform.Source instead.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File schemaLocation = new File(&quot;/opt/xml/docbook/xsd/docbook.xsd&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Schema schema = factory.newSchema(schemaLocation);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 3. Get a validator from the schema.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Validator validator = schema.newValidator();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 4. Parse the document you want to check.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Source source = new StreamSource(args[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 5. Check the document<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validator.validate(source);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(args[0] + &quot; is valid.&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (SAXException ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(args[0] + &quot; is not valid because &quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(ex.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; </p>
<p>如果要使用xml自身指定的xsd进行校验，则使用下面的方法：<br />
SchemaFactory factory = SchemaFactory.newInstance(&quot;http://www.w3.org/2001/XMLSchema&quot;);<br />
Schema schema = factory.newSchema();<br />
这种方法仅适用于 XSD。</p>
<p><strong> 参考文章：</strong><br />
&nbsp;Java 语言的 XML 验证 API (www.ibm.com/developerworks/cn/xml/x-javaxmlvalidapi.html)<br />
&nbsp;JAXP 专述(www-128.ibm.com/developerworks/cn/xml/jaxp/)</p>
<p><strong> 用JAXP解析xml：</strong><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DocumentBuilder parser = factory.newDocumentBuilder();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.w3c.dom.Document doc = parser.parse(&quot;temp.xml&quot;);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得根节点元素<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node record=doc.getFirstChild();</p>
<p>
由于对xml没有系统的理解，以上仅为粗糙可用的代码，并不理解其中的原理，有待进一步学习。<br />
具体代码见：http://210.34.4.9:8080/svn/SvnTest/datacheck1.0/</p>
]]></content:encoded>
			<wfw:commentRss>http://ringtail.xmulib.org/2006/11/30/%e5%88%a9%e7%94%a8java-api%e6%a0%a1%e9%aa%8c%e5%92%8c%e8%a7%a3%e6%9e%90xml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java 优化编程阅读笔记二</title>
		<link>http://ringtail.xmulib.org/2006/07/14/java-%e4%bc%98%e5%8c%96%e7%bc%96%e7%a8%8b%e9%98%85%e8%af%bb%e7%ac%94%e8%ae%b0%e4%ba%8c/</link>
		<comments>http://ringtail.xmulib.org/2006/07/14/java-%e4%bc%98%e5%8c%96%e7%bc%96%e7%a8%8b%e9%98%85%e8%af%bb%e7%ac%94%e8%ae%b0%e4%ba%8c/#comments</comments>
		<pubDate>Fri, 14 Jul 2006 09:04:01 +0000</pubDate>
		<dc:creator>ringtail</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://ringtail.xmulib.org/2006/07/14/java-%e4%bc%98%e5%8c%96%e7%bc%96%e7%a8%8b%e9%98%85%e8%af%bb%e7%ac%94%e8%ae%b0%e4%ba%8c/</guid>
		<description><![CDATA[第二章内存管理
这章看得不太懂，觉得书上还是没有说明原理，等看到其它的再补充上来吧。

第三章表达式、语句和保留字

使用循环语句的几个建议：

1.&#160;&#160; 当作数组拷贝操作时，采用System.arraycopy()效率更高。
使用了以下代码段： 



public class Test {
&#160;public Test(){
&#160;&#160;
&#160;}
&#160;public static void main(String []args){
&#160;&#160;long startIndex,endIndex;
&#160;&#160;int maxLength=1000000;
&#160;&#160;int []a=new int[maxLength];
&#160;&#160;int []b=new int[maxLength];
&#160;&#160;for(int i=0;i&#60;a.length;i++){
&#160;&#160;&#160;a[i]=i;
&#160;&#160;}
&#160;&#160;startIndex=System.currentTimeMillis();
&#160;&#160;for(int i=0;i&#60;a.length;i++){
&#160;&#160;&#160;b[i]=a[i];
&#160;&#160;}
&#160;&#160;endIndex=System.currentTimeMillis();
&#160;&#160;System.out.println(endIndex-startIndex);
&#160;&#160;int []c=new int[maxLength];
&#160;&#160;startIndex=System.currentTimeMillis();
&#160;&#160;System.arraycopy(a, 0, c, 0, c.length);
&#160;&#160;endIndex=System.currentTimeMillis();
&#160;&#160;System.out.println(endIndex-startIndex);
&#160;&#160;
&#160;}
}




发现结果如下：



maxLength值
1000000
2500000
5000000


结果1
0
15
31


结果2
0
16

47




并非和文章中所提到的一样（2500000，105，45），所以不赞同作者的这个观点。
2.&#160;&#160; 尽量避免在循环体中调用方法
3.&#160;&#160;&#160;最好避免在循环体内存取数据元素，比较好的办法是在循环体内采用临时变量，在循环体外更改数组的值。这是因为在循环体内使用变量比存取数组元素要快。
4.&#160;&#160; 避免在做最终条件时采用方法返回值的方式判断。
如：

&#8230;
while(isTrue()){
&#160;&#8230;
}
&#8230;
应该写作：
boolean isTrue=isTrue();
while(isTrue){
&#160;&#8230;
}
&#8230;
5.&#160;&#160; 尽量避免在循环体中使用try-catch 块，最好在循环体外使用。
如:
do{
&#160;try{
&#160;&#160;&#8230;
&#160;}catch(Exception e){
&#160;&#160;&#8230;
&#160;}
}while(isTrue);
建议使用下面的方式：
try{
&#160;do{
&#160;&#160;&#8230;
&#160;}while(isTrue);
}catch(Exception e){
&#160;&#160;&#8230;
}
6.&#160; 在多重循环中，如果有可能，尽量将最长的循环放在最内层，最短的循环放在最外层。
]]></description>
			<content:encoded><![CDATA[<p><strong>第二章内存管理</strong><br />
这章看得不太懂，觉得书上还是没有说明原理，等看到其它的再补充上来吧。</p>
<p>
<strong>第三章表达式、语句和保留字<br />
</strong></p>
<p><strong>使用循环语句的几个建议：</strong></p>
<p><span id="more-8"></span></p>
<p>1.&nbsp;&nbsp; 当作数组拷贝操作时，采用System.arraycopy()效率更高。<br />
使用了以下代码段： </p>
<table cellspacing="1" cellpadding="1" width="286" summary="" border="1">
<tbody>
<tr>
<td>public class Test {<br />
&nbsp;public Test(){<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
&nbsp;public static void main(String []args){<br />
&nbsp;&nbsp;long startIndex,endIndex;<br />
&nbsp;&nbsp;int maxLength=1000000;<br />
&nbsp;&nbsp;int []a=new int[maxLength];<br />
&nbsp;&nbsp;int []b=new int[maxLength];<br />
&nbsp;&nbsp;for(int i=0;i&lt;a.length;i++){<br />
&nbsp;&nbsp;&nbsp;a[i]=i;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;startIndex=System.currentTimeMillis();<br />
&nbsp;&nbsp;for(int i=0;i&lt;a.length;i++){<br />
&nbsp;&nbsp;&nbsp;b[i]=a[i];<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;endIndex=System.currentTimeMillis();<br />
&nbsp;&nbsp;System.out.println(endIndex-startIndex);<br />
&nbsp;&nbsp;int []c=new int[maxLength];<br />
&nbsp;&nbsp;startIndex=System.currentTimeMillis();<br />
&nbsp;&nbsp;System.arraycopy(a, 0, c, 0, c.length);<br />
&nbsp;&nbsp;endIndex=System.currentTimeMillis();<br />
&nbsp;&nbsp;System.out.println(endIndex-startIndex);<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
}</td>
</tr>
</tbody>
</table>
<p>
发现结果如下：</p>
<table cellspacing="1" cellpadding="1" width="320" summary="" border="1">
<tbody>
<tr>
<td>maxLength值</td>
<td>1000000</td>
<td>2500000</td>
<td>5000000</td>
</tr>
<tr>
<td>结果1</td>
<td>0</td>
<td>15</td>
<td>31</td>
</tr>
<tr>
<td>结果2</td>
<td>0</td>
<td>16
</td>
<td>47</td>
</tr>
</tbody>
</table>
<p>
并非和文章中所提到的一样（2500000，105，45），所以不赞同作者的这个观点。</p>
<p>2.&nbsp;&nbsp; 尽量避免在循环体中调用方法<br />
3.&nbsp;&nbsp;&nbsp;最好避免在循环体内存取数据元素，比较好的办法是在循环体内采用临时变量，在循环体外更改数组的值。这是因为在循环体内使用变量比存取数组元素要快。</p>
<p>4.&nbsp;&nbsp; 避免在做最终条件时采用方法返回值的方式判断。<br />
如：</p>
<p>
&#8230;<br />
while(isTrue()){<br />
&nbsp;&#8230;<br />
}<br />
&#8230;<br />
应该写作：<br />
boolean isTrue=isTrue();<br />
while(isTrue){<br />
&nbsp;&#8230;<br />
}<br />
&#8230;</p>
<p>5.&nbsp;&nbsp; 尽量避免在循环体中使用try-catch 块，最好在循环体外使用。<br />
如:<br />
do{<br />
&nbsp;try{<br />
&nbsp;&nbsp;&#8230;<br />
&nbsp;}catch(Exception e){<br />
&nbsp;&nbsp;&#8230;<br />
&nbsp;}<br />
}while(isTrue);<br />
建议使用下面的方式：<br />
try{<br />
&nbsp;do{<br />
&nbsp;&nbsp;&#8230;<br />
&nbsp;}while(isTrue);<br />
}catch(Exception e){<br />
&nbsp;&nbsp;&#8230;<br />
}<br />
6.&nbsp; 在多重循环中，如果有可能，尽量将最长的循环放在最内层，最短的循环放在最外层。</p>
]]></content:encoded>
			<wfw:commentRss>http://ringtail.xmulib.org/2006/07/14/java-%e4%bc%98%e5%8c%96%e7%bc%96%e7%a8%8b%e9%98%85%e8%af%bb%e7%ac%94%e8%ae%b0%e4%ba%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java 优化编程阅读笔记一</title>
		<link>http://ringtail.xmulib.org/2006/07/14/java-%e4%bc%98%e5%8c%96%e7%bc%96%e7%a8%8b%e9%98%85%e8%af%bb%e7%ac%94%e8%ae%b0%e4%b8%80/</link>
		<comments>http://ringtail.xmulib.org/2006/07/14/java-%e4%bc%98%e5%8c%96%e7%bc%96%e7%a8%8b%e9%98%85%e8%af%bb%e7%ac%94%e8%ae%b0%e4%b8%80/#comments</comments>
		<pubDate>Fri, 14 Jul 2006 02:41:07 +0000</pubDate>
		<dc:creator>ringtail</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://ringtail.xmulib.org/2006/07/14/java-%e4%bc%98%e5%8c%96%e7%bc%96%e7%a8%8b%e9%98%85%e8%af%bb%e7%ac%94%e8%ae%b0%e4%b8%80/</guid>
		<description><![CDATA[Java优化编程
林胜利等编著，电子工业出版社
说明：仅记录自己以前不明白或觉得重要的东西。

第一章Java程序设计风格
&#160;

关于文件注释头：
需要说明的部分有：该类的功能及特点，该类是否被测试过，@see(与该类相关联的类)，
@author(作者)，@since(该文件所支持的JDK版本)，@version(版本)，@date(开发日期)，最后更改日期，修改人，复审人

命名规则：

包：
包名应该是独一无二的，通常都是小写，一般是公司域名的倒序，域名后面的部分可以根据习惯命名。 
类和接口：
大写字母开头，尽量由具有实际意义的单词组成。 
方法：
一般来说是动词，第一个字母小写，多个单词混合的情况下，第一个单词后的所有单词的第一个字母大写，
如：run();runFast();getBackground();
方法的声明最好采用功能性分组的方式进行排列。 
变量：
和方法的命名规则相同。 
常量：
大写，例如：Static final int MIN_WIDTH=14; 

其余的排版问题，只需要在编写代码结束后，按Ctrl+Shift+f排版就可以了。(Eclipse和NetBeans都支持)
]]></description>
			<content:encoded><![CDATA[<p>Java优化编程</p>
<p>林胜利等编著，电子工业出版社</p>
<p>说明：仅记录自己以前不明白或觉得重要的东西。</p>
<p>
第一章Java程序设计风格</p>
<p>&nbsp;</p>
<p><span id="more-7"></span></p>
<p><strong>关于文件注释头：<br />
</strong>需要说明的部分有：该类的功能及特点，该类是否被测试过，@see(与该类相关联的类)，<br />
@author(作者)，@since(该文件所支持的JDK版本)，@version(版本)，@date(开发日期)，最后更改日期，修改人，复审人<br />
<strong></strong></p>
<p><strong>命名规则：</strong></p>
<ol>
<li>包：<br />
包名应该是独一无二的，通常都是小写，一般是公司域名的倒序，域名后面的部分可以根据习惯命名。 </li>
<li>类和接口：<br />
大写字母开头，尽量由具有实际意义的单词组成。 </li>
<li>方法：<br />
一般来说是动词，第一个字母小写，多个单词混合的情况下，第一个单词后的所有单词的第一个字母大写，<br />
如：run();runFast();getBackground();<br />
方法的声明最好采用功能性分组的方式进行排列。 </li>
<li>变量：<br />
和方法的命名规则相同。 </li>
<li>常量：<br />
大写，例如：Static final int MIN_WIDTH=14; </li>
</ol>
<p>其余的排版问题，只需要在编写代码结束后，按Ctrl+Shift+f排版就可以了。(Eclipse和NetBeans都支持)</p>
]]></content:encoded>
			<wfw:commentRss>http://ringtail.xmulib.org/2006/07/14/java-%e4%bc%98%e5%8c%96%e7%bc%96%e7%a8%8b%e9%98%85%e8%af%bb%e7%ac%94%e8%ae%b0%e4%b8%80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
