﻿<?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-ゞ沉默是金ゞ-随笔分类-Java SE</title><link>http://www.blogjava.net/dashi99/category/37044.html</link><description>&lt;div align="center"&gt;
&lt;img height="50" width="200" name="welcome" src="http://www.blogjava.net/images/blogjava_net/majianan/14891/r_5858488902000cu2.gif"/&gt;
&lt;/div&gt;
&lt;br/&gt;
&lt;center&gt;&lt;font size=4 &gt;鱼离不开水,但是没有说不离开哪滴水.&lt;/font&gt;&lt;/center&gt;</description><language>zh-cn</language><lastBuildDate>Sat, 15 Dec 2012 09:56:15 GMT</lastBuildDate><pubDate>Sat, 15 Dec 2012 09:56:15 GMT</pubDate><ttl>60</ttl><item><title>jvm学习笔记</title><link>http://www.blogjava.net/dashi99/archive/2012/12/14/393000.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Fri, 14 Dec 2012 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/12/14/393000.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/393000.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/12/14/393000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/393000.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/393000.html</trackback:ping><description><![CDATA[<a href="http://dl.iteye.com/upload/attachment/0077/7621/4698d147-570f-3fb8-a424-7e538cb587e4.bmp">http://dl.iteye.com/upload/attachment/0077/7621/4698d147-570f-3fb8-a424-7e538cb587e4.bmp</a><img src ="http://www.blogjava.net/dashi99/aggbug/393000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-12-14 15:32 <a href="http://www.blogjava.net/dashi99/archive/2012/12/14/393000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ThreadPoolExecutor usage summary</title><link>http://www.blogjava.net/dashi99/archive/2012/11/27/392065.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 27 Nov 2012 05:43:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/11/27/392065.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/392065.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/11/27/392065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/392065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/392065.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1. use ThreadPoolExecutor to do some data work, the thread number is solid. for example:storing data into cache, process large mount of data.Code highlighting produced by Actipro CodeHighlighter (fr...&nbsp;&nbsp;<a href='http://www.blogjava.net/dashi99/archive/2012/11/27/392065.html'>阅读全文</a><img src ="http://www.blogjava.net/dashi99/aggbug/392065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-11-27 13:43 <a href="http://www.blogjava.net/dashi99/archive/2012/11/27/392065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 13: java.util.concurrent - Atomic Variables </title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384887.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384887.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384887.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384887.html</trackback:ping><description><![CDATA[<div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">In  this article we will look into Atomic Variables which can help us to  write lock free and wait free algorithms which were not possible prior  to Java 5.0.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">Two main points about Atomic Variables are&nbsp;</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="line-height: normal;"><span style="color: #333333;"><span style="font: normal normal normal 7pt/normal 'Times New Roman';"><span style="font-family: 'Courier New';"><span style="line-height: 10.75pt;"><br /> </span></span></span></span></span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="line-height: normal;"><span style="font: normal normal normal 7pt/normal 'Times New Roman';"><span style="font-family: 'Courier New';"><span style="line-height: 10.75pt;"><span style="color: #333333; font-size: small;">&nbsp;&nbsp; 1.</span><span style="color: #cc0000; font-size: large;"><strong>&nbsp;</strong></span></span></span></span></span><span style="line-height: normal;"><span style="font-family: 'Courier New'; line-height: 10.75pt;"><span style="color: #cc0000; font-size: large;"><strong>Help to write lock free and wait free algorithm</strong></span><span style="color: #333333;"> &#8211;</span></span></span></div><div style="line-height: 10.75pt; margin-left: .5in;"><br /> </div><div style="line-height: 10.75pt; margin-left: .5in;"><span style="color: #333333; font-family: 'Courier New';">Under  high contention ( lots of thread are fighting for lock ), JVM spends  more time with scheduling of threads, managing contention, queues of  waiting threads and less time in doing the real work.</span></div><div style="line-height: 10.75pt; margin-left: .5in;"><span style="color: #333333; font-family: 'Courier New';">This dramatically reduces the throughput of the process.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in;"><strong><span style="color: #333333; font-family: 'Courier New';">Problem with locking:</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;1) Thread in block state cannot do anything else.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp; &nbsp;2) If the blocked thread is high priority, then its a big disaster.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; 3) Can cause Dead lock</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; 4) Managing a Block thread is a heavy weight process, so throughput decreases.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">Soon we will see how can we write lock free algorithms using atomic variables</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';"><span style="font: normal normal normal 7pt/normal 'Times New Roman';"><br /> </span></span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';"><span style="font: normal normal normal 7pt/normal 'Times New Roman';"><br /> </span></span></div><div style="margin-bottom: 0.0001pt; margin-left: 0.25in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333;"><span style="font: normal normal normal 7pt/normal 'Times New Roman';"><span style="font-family: 'Courier New';"><span style="line-height: 10.75pt;"><span style="font-size: small;">2.</span>&nbsp;</span></span></span></span><span style="font-family: 'Courier New'; line-height: 10.75pt;"><strong><span style="color: #cc0000; font-size: large;">Implement very light weight process like CAS &#8211;</span></strong></span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><strong><span style="color: #333333; font-family: 'Courier New';">CAS (compares and swap):</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">Let&#8217;s  take an example to understand the concept of CAS. Suppose we have once  variable &#8220;i&#8221; and we are doing some calculation over &#8220;I&#8221; and storing the  result back into &#8220;i&#8221;. In a nutshell-</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = someComplicateComputation( i )</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">for &#8220;i&#8221; = 1,</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; someComplicatedComputation(i) </span><span style="color: #333333; font-family: Wingdings;">&#232;</span><span style="color: #333333; font-family: 'Courier New';"> 1234</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">In CAS Process following happens-</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A memory location V will be defined.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A local variable A will be defined.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A local variable B will be defined.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">V will hold the initial value of &#8220;i&#8221;. So</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V = i =1</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">A = V = 1</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">B = result of that computation = 1234</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">compare ( V , A )</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';"><strong>if </strong></span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">both values are same --&gt; replace V with B's value.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';"><strong>else</strong></span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  this means in the mean while someone has changed the value of V, so  repeat the whole process again. Lets someone changes the value of &#8220;i&#8221;,  hence V to 2.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; V = 2;</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; A = V = 2</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; B = result = 3246;</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compare ( V , A )</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and so on...!!</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .5in; margin-right: 0in; margin-top: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div><span style="color: #333333; font-family: 'Courier New';">This is very light weight process. This CAS technique is implemented by atomic package classes.</span><br /> <span style="color: #333333; font-family: 'Courier New';"><br /> </span><br /> <br /> <span style="font-family: 'Courier New';"><span style="font-family: 'Courier New';"><strong><span style="color: #cc0000;">Example </span></strong><span style="color: #333333;">&#8211;  Lets write a simple program which first increase the number by 1, then  decrease the number by 1, and then increase again by 1. So overall  effect is increase the number by 1. Lets run 4 threads concurrently  access the method and compare the performance of AtomicInteger Vs  Integer.</span></span></span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.jovialjava.blog.threads;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.atomic.</span><span style="color: #000000; ">*</span><span style="color: #000000; ">;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;AtomicVariableExample&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Runnable&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;AtomicInteger&nbsp;atomic_int_1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;AtomicInteger();<br />&nbsp;&nbsp;&nbsp;&nbsp;AtomicInteger&nbsp;atomic_int_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;AtomicInteger();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;int_1;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;int_2;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;count&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AtomicVariableExample&nbsp;pr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;AtomicVariableExample();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Thread(pr).start();</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;1&nbsp;0&nbsp;1</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Thread(pr).start();</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;2&nbsp;1&nbsp;2</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Thread(pr).start();&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;3&nbsp;2&nbsp;3</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Thread(pr).start();&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;4&nbsp;3&nbsp;4</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(count&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(pr.atomic_int_1.get());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(pr.int_1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Inside&nbsp;run&nbsp;method<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doCalc();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;doCalc()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atomic_int_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;atomic_int_1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;int_1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atomic_int_2.incrementAndGet();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;int_2&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atomic_int_2.decrementAndGet();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;int_2&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atomic_int_2.incrementAndGet();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;int_2&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atomic_int_1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;atomic_int_2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int_1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;int_2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /></span></div><img src ="http://www.blogjava.net/dashi99/aggbug/384887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:50 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 12: java.util.concurrent : SingleThreadPool Example </title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384886.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384886.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384886.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384886.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384886.html</trackback:ping><description><![CDATA[<div><div style="line-height: 10.75pt;"><span style="color: #333333; font-family: 'Courier New';">This  article will discuss about Thread pool that uses single thread to  execute tasks. From Java 5.0+ one can get such pool from Executors using  following method &#8211;</span></div><div style="margin-bottom: .0001pt; margin-bottom: 0in;"><span style="font-size: large;"><strong><span style="color: #333333; font-family: 'Courier New';">public static ExecutorService</span></strong><strong><span style="color: #cc0000; font-family: 'Courier New';">&nbsp;newSingleThreadExecutor()</span></strong></span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;</span>&nbsp;<span style="color: #333333; font-family: 'Courier New';">Creates  an Executor that uses a single worker thread operating off an unbounded  queue. (Note however that if this single thread terminates due to a  failure during execution prior to shutdown, a new one will take its  place if needed to execute subsequent tasks.) Tasks are guaranteed to  execute sequentially, and no more than one task will be active at any  given time. Unlike the otherwise equivalent newFixedThreadPool(1) the  returned executor is guaranteed not to be reconfigurable to use  additional threads.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><br /> </div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><br /> </div><div style="margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #cc0000; font-family: 'Courier New';">Example-</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">Suppose  we have 100 properties files in an application. We have one thread that  can read properties file and return a map value. </span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #333333; font-family: 'Courier New';">Pseudo code &#8211;&nbsp;</span></strong><strong><span style="color: #cc0000; font-family: &quot;Courier New&quot;;Times New Roman&quot;;">READER THREAD</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">Config Reader implements Callable&lt;Map&lt;String, String&gt;</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">try{</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;</span><strong>&nbsp;</strong><strong>&nbsp;</strong><strong><span style="color: #38761d; font-family: 'Courier New';">// Get the file name in the constructor of thread</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp; &nbsp;// Check if File exists</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp; &nbsp;// Read the file and retrun the map object</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">}catch(Exception e){</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: #38761d; font-family: 'Courier New';">//release all the resource</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //return null</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">}</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">Main THREAD-</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: #38761d; font-family: 'Courier New';">// Get a Single thread pool from Executors</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;try{</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: #38761d; font-family: 'Courier New';">// Get the list of all properties file in the directory</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; // Create a READER THREAD by passing the name of file</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; // store the READER thread in the a list</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp; &nbsp;//release all the thread in one go and get the Map objects</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">}catch(Exception e){</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: #38761d; font-family: 'Courier New';">//release all the resources</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // print the stack trace</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">}finally{</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: #38761d; font-family: 'Courier New';">//shutdown the thread pool</span></strong></div><span style="color: #333333; font-family: 'Courier New';">}</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.jovialjava.blog.threads;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.File;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.FileInputStream;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.ArrayList;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.List;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.Properties;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Callable;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ExecutorService;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Executors;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Future;<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;SingleReader&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;SingleReader(String&nbsp;name)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Properties&nbsp;call()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;f&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;prop&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Properties();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(f.exists()&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;f.canRead()&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;f.isFile())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;in&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileInputStream(f);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prop.load(in);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;prop;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Please&nbsp;check&nbsp;about&nbsp;this&nbsp;file:[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;f.getAbsolutePath()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;SingleThreadPoolExample&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;String&nbsp;directory&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">config</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;ExecutorService&nbsp;executorPool&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;dir&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(directory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(dir.isDirectory())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;fileList&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;files&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;dir.list();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Optimization&nbsp;-&nbsp;Single&nbsp;thread&nbsp;executor.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Executors.newSingleThreadExecutor();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(String&nbsp;file&nbsp;:&nbsp;files)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;reader&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;SingleReader(dir.getAbsolutePath()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;File.separator&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;file);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileList.add(reader);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Future</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;results&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;executorPool.invokeAll(fileList);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Check&nbsp;how&nbsp;many&nbsp;success&nbsp;and&nbsp;how&nbsp;many&nbsp;failure<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;success&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;failure&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(Future</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;result&nbsp;:&nbsp;results)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(result.get()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;failure</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Total&nbsp;number&nbsp;of&nbsp;files&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;fileList.size()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Success&nbsp;Count&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;success&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Failure&nbsp;Count&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;failure&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;IllegalArgumentException(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">There&nbsp;is&nbsp;no&nbsp;such&nbsp;directory&nbsp;name&nbsp;-</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;directory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(executorPool&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool.shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /></span></div><img src ="http://www.blogjava.net/dashi99/aggbug/384886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:49 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 11: java.util.concurrent - CachedThreadPool Example</title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384885.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384885.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384885.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384885.html</trackback:ping><description><![CDATA[<div><div style="line-height: 10.75pt;"><span style="color: #333333; font-family: 'Courier New';">This  article will discuss about Thread pool that can reuse previously  constructed threads when they are available. From Java 5.0+ one can get  such pool from Executors using following method &#8211;</span></div><div style="margin-bottom: .0001pt; margin-bottom: 0in;"><span style="font-size: large;"><strong><span style="color: #333333; font-family: 'Courier New';">public static ExecutorService</span></strong><strong><span style="color: #cc0000; font-family: 'Courier New';">&nbsp;newCachedThreadPool()</span></strong></span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">Creates  a thread pool that creates new threads as needed, but will reuse  previously constructed threads when they are available. These pools will  typically improve the performance of programs that execute many  short-lived asynchronous tasks. Calls to execute will reuse previously  constructed threads if available. If no existing thread is available, a  new thread will be created and added to the pool. Threads that have not  been used for sixty seconds are terminated and removed from the cache.  Thus, a pool that remains idle for long enough will not consume any  resources. Note that pools with similar properties but different details  (for example, timeout parameters) may be created using  ThreadPoolExecutor constructors.</span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><br /> </div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><br /> </div><div style="margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #cc0000; font-family: 'Courier New';">Example-</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">Suppose  we have 100 properties files in an application. We have one thread that  can read properties file and return a map value. We want to optimize  the time to read all 100 properties file by using concurrent reading.  Here optimize means &#8211; we need a perfect balance between CPU Utilization  and total time consumed by reading process.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #333333; font-family: 'Courier New';">Pseudo code &#8211;&nbsp;</span></strong><strong><span style="color: #cc0000; font-family: &quot;Courier New&quot;;Times New Roman&quot;;">READER THREAD</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">Config Reader implements Callable&lt;Map&lt;String, String&gt;</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">try{</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;</span><strong>&nbsp;</strong><strong>&nbsp;</strong><strong><span style="color: #38761d; font-family: 'Courier New';">// Get the file name in the constructor of thread</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp; &nbsp;// Check if File exists</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp; &nbsp;// Read the file and retrun the map object</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">}catch(Exception e){</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: #38761d; font-family: 'Courier New';">//release all the resource</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //return null</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">}</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">Main THREAD-</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: #38761d; font-family: 'Courier New';">// Get a Cached thread pool from Executors</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;try{</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: #38761d; font-family: 'Courier New';">// Get the list of all properties file in the directory</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; // Create a READER THREAD by passing the name of file</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; // store the READER thread in the a list</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp; &nbsp;//release all the thread in one go and get the Map objects</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">}catch(Exception e){</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: #38761d; font-family: 'Courier New';">//release all the resources</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #38761d; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // print the stack trace</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">}finally{</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: #38761d; font-family: 'Courier New';">//shutdown the thread pool</span></strong></div><span style="color: #333333; font-family: 'Courier New';">}</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.jovialjava.blog.threads;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.File;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.FileInputStream;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.ArrayList;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.List;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.Properties;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Callable;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ExecutorService;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Executors;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Future;<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;CachedReader&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;CachedReader(String&nbsp;name)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Properties&nbsp;call()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;f&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;prop&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Properties();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(f.exists()&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;f.canRead()&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;f.isFile())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;in&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileInputStream(f);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prop.load(in);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;prop;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Please&nbsp;check&nbsp;about&nbsp;this&nbsp;file:[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;f.getAbsolutePath()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;CachedThreadPoolExample&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;String&nbsp;directory&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">config</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;ExecutorService&nbsp;executorPool&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;MAX_THREADS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;dir&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(directory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(dir.isDirectory())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;fileList&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;files&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;dir.list();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Optimization&nbsp;-&nbsp;Reuse&nbsp;the&nbsp;the&nbsp;threads.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Executors.newCachedThreadPool();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(String&nbsp;file&nbsp;:&nbsp;files)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;reader&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;CachedReader(dir.getAbsolutePath()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;File.separator&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;file);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileList.add(reader);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Future</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;results&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;executorPool.invokeAll(fileList);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Check&nbsp;how&nbsp;many&nbsp;success&nbsp;and&nbsp;how&nbsp;many&nbsp;failure<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;success&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;failure&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(Future</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;result&nbsp;:&nbsp;results)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(result.get()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;failure</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Total&nbsp;number&nbsp;of&nbsp;files&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;fileList.size()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Success&nbsp;Count&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;success&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Failure&nbsp;Count&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;failure&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;IllegalArgumentException(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">There&nbsp;is&nbsp;no&nbsp;such&nbsp;directory&nbsp;name&nbsp;-</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;directory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(executorPool&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool.shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div><img src ="http://www.blogjava.net/dashi99/aggbug/384885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:47 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 10: java.util.concurrent - ScheduledThreadPool Example </title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384884.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384884.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384884.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384884.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384884.html</trackback:ping><description><![CDATA[<div><div style="line-height: 10.75pt;"><span style="color: #333333; font-family: 'Courier New';">This  article will discuss about Thread pool that can schedule threads to run  after a specified interval of time. From Java 5.0+ one can get such  pool from Executors using following method &#8211;</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #333333; font-family: 'Courier New'; font-size: 18pt;">public static ScheduledExecutorService</span></strong><strong>&nbsp;</strong></div><div style="margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #cc0000; font-family: 'Courier New'; font-size: 18pt;">&nbsp;&nbsp; &nbsp; &nbsp; newScheduledThreadPool(int corePoolSize)</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New'; font-size: 10pt;">&nbsp;&nbsp;&nbsp;</span>&nbsp;<span style="color: #333333; font-family: 'Courier New';">Creates a thread pool that can schedule commands to run after a given delay, or to execute periodically.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">The  return type of this method (return type of thread pool) is  ScheduledExecutorService.Some of the salient features of  ScheduledExecutorService are &#8211;</span></div><ol><li><strong><span style="color: #333333; font-family: Wingdings;"><span style="font: normal normal normal 7pt/normal 'Times New Roman';">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span></span><span style="color: #333333; font-family: 'Courier New';">Schedule a Callable or Runnable to run once with a fixed delay after submission</span></strong></li><li><strong><span style="color: #333333; font-family: Wingdings;"><span style="font: normal normal normal 7pt/normal 'Times New Roman';">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span></span><span style="color: #333333; font-family: 'Courier New';">Schedule a Runnable to run periodically at a fixed rate</span></strong></li><li><strong><span style="color: #333333; font-family: Wingdings;"><span style="font: normal normal normal 7pt/normal 'Times New Roman';">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span></span><span style="color: #333333; font-family: 'Courier New';"><span style="color: black; font-family: 'Times New Roman'; font-weight: normal;"><strong><span style="color: #333333; font-family: 'Courier New';">S</span></strong></span>chedule a Runnable to run periodically with a fixed delay between executions</span></strong></li><li><strong><span style="color: #333333; font-family: Wingdings;"><span style="font: normal normal normal 7pt/normal 'Times New Roman';">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span></span><span style="color: #333333; font-family: 'Courier New';">Submission returns a ScheduledFutureTask handle which can be used to cancel the task</span></strong></li><li><span style="color: #333333; font-family: 'Courier New';"><strong>&nbsp;.Like Timer, but supports pooling</strong></span></li></ol><br /> <div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><br /> </div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="font-family: 'Courier New';"><strong><u><span style="color: #cc0000; font-size: large;">Example</span></u></strong><span style="color: #333333;">:</span></span></div><ol><li><span style="font-family: 'Courier New';"><span style="color: #cc0000;">Suppose we are building a Bank check processing system. Here is the process &#8211;</span></span></li><li><span style="color: #cc0000;"><span style="font-family: Wingdings;">&nbsp;</span><span style="font-family: 'Courier New';">Every local branch collect cheques and create a txt file contain cheque info.</span></span></li><li><span style="color: #cc0000;"><span style="font-family: Wingdings;">&nbsp;</span><span style="font-family: 'Courier New';">A service runs which copy the cheque txt file from local branch to main server.</span></span></li><li><span style="color: #cc0000;"><span style="font-family: Wingdings;">&nbsp;</span><span style="font-family: 'Courier New';">A Local service runs on server which check if any file has received and notify the cheque&nbsp;</span><span style="font-family: 'Courier New';">Clearing process.</span></span></li></ol><br /> <div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><br /> </div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';"><strong>We  will try to make &#8220;Local Service&#8221;, which check the file reception and  &#8220;Copying process&#8221; Which copy file from client machine to Server.</strong></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="font-family: 'Courier New';"><strong><span style="color: #38761d;">Pseudo Code-</span></strong></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><br /> </div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="font-family: 'Courier New';"><span style="color: #38761d;">//Define Local &amp; Copying service running interval time in Seconds</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="font-family: 'Courier New';"><span style="color: #38761d;">//Make an ScheduledThreadPool with pool size 2</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">try{</span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 'Courier New';"><span style="color: #38761d;">// Make Local Service thread</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="font-family: 'Courier New';"><span style="color: #38761d;">&nbsp;&nbsp;&nbsp; // Make Copying process thread</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="font-family: 'Courier New';"><span style="color: #38761d;">&nbsp;&nbsp;&nbsp; // Scheduled Both thread to run at regular interval</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">}catch(Exception e){</span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;">&nbsp;<span style="font-family: 'Courier New';"><span style="color: #38761d;">//release all resources</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">}</span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><br /> </div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">LocalService Thread-</span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">Try{</span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 'Courier New';"><span style="color: #38761d;">//Check if directory exists</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="font-family: 'Courier New';"><span style="color: #38761d;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Check if any file exists in directory</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="font-family: 'Courier New';"><span style="color: #38761d;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //return status</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">}catch(Exception e){</span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 'Courier New';"><span style="color: #38761d;">//Print necessary exception</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">}</span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><br /> </div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">Copying Process Thread-</span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">Try{</span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp; </span><span style="font-family: 'Courier New';"><span style="color: #38761d;">// Check if File existin on remote server</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="font-family: 'Courier New';"><span style="color: #38761d;">&nbsp;&nbsp;&nbsp;// Copy the file to main server</span></span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">}catch(Exception e){</span></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-autospace: none;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 'Courier New';"><span style="color: #38761d;">//Print necessary exception</span></span></div><span style="color: #333333; font-family: 'Courier New';">}</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.jovialjava.blog.threads;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.File;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Executors;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ScheduledExecutorService;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.TimeUnit;<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">LOCAL&nbsp;SERVICE&nbsp;THREAD</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;LocalService&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Runnable&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;DIRECTORY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;LocalService(String&nbsp;DIRECTORY)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.DIRECTORY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;DIRECTORY;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;dir&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.DIRECTORY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(dir.isDirectory())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(dir.list().length&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">FILE&nbsp;EXISTS</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">NO&nbsp;SUCH&nbsp;DIRECTORY&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;dir.getAbsolutePath()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]&nbsp;exists</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;COPYING&nbsp;SERVICE&nbsp;THREAD</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;CopyService&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Runnable&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;REMOTE_DIR&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;LOCAL_DIR&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;CopyService(String&nbsp;remoteDir,&nbsp;String&nbsp;localDir)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.REMOTE_DIR&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;remoteDir;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.LOCAL_DIR&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;localDir;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;remote&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.REMOTE_DIR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;local&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.LOCAL_DIR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(remote.isDirectory()&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;local.isDirectory())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(remote.list().length&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">REMOTE&nbsp;FILE&nbsp;FOUND,&nbsp;COPYING</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;---&nbsp;Call&nbsp;the&nbsp;file&nbsp;copying&nbsp;method.</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">NO&nbsp;REMOTE&nbsp;FILE&nbsp;FOUND</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">PLEASE&nbsp;CHECK&nbsp;DIRECTORY&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;remote.getAbsolutePath()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;OR/AND</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;local.getAbsolutePath()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]&nbsp;existence</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ScheduledExample&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;ScheduledExecutorService&nbsp;executor&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Executors.newScheduledThreadPool(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;LOCAL_INTERVAL&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;COPY_INTERVAL&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;REMOTE_DIR&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">REMOTE</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;LOCAL_DIR&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">LOCAL</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runnable&nbsp;localService&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;LocalService(LOCAL_DIR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runnable&nbsp;remoteService&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;CopyService(REMOTE_DIR,&nbsp;LOCAL_DIR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executor.scheduleWithFixedDelay(localService,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;LOCAL_INTERVAL,&nbsp;TimeUnit.SECONDS);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executor.scheduleWithFixedDelay(remoteService,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;COPY_INTERVAL,&nbsp;TimeUnit.SECONDS);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div><img src ="http://www.blogjava.net/dashi99/aggbug/384884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:45 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 9: java.util.concurrent : FixedThreadPool Example </title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384882.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384882.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384882.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384882.html</trackback:ping><description><![CDATA[<div><div style="line-height: 10.75pt;"><span style="color: #333333; font-family: 'Courier New';">This  article will discuss about Thread pool with fixed number of thread.  From Java 5.0+ one can get such pool from Executors using following  method &#8211;</span></div><div style="margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #333333; font-family: &quot;Courier New&quot;; font-size: 18.0pt;Times New Roman&quot;;">public static ExecutorService</span></strong><strong>&nbsp;</strong></div><div style="margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #cc0000; font-family: &quot;Courier New&quot;; font-size: 18.0pt;Times New Roman&quot;;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newFixedThreadPool(int nThreads)</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: &quot;Courier New&quot;; font-size: 10.0pt;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;</span>&nbsp;<span style="color: #333333; font-family: 'Courier New';">Creates  a thread pool that reuses a fixed number of threads operating off a  shared unbounded queue. At any point, at most nThreads threads will be  active processing tasks. If additional tasks are submitted when all  threads are active, they will wait in the queue until a thread is  available. If any thread terminates due to a failure during execution  prior to shutdown, a new one will take its place if needed to execute  subsequent tasks. The threads in the pool will exist until it is  explicitly shutdown.</span></div><div style="line-height: 10.75pt;"><br /> </div><div style="line-height: 10.75pt;"><span style="font-family: 'Courier New';"><span style="color: #cc0000; font-size: large;"><strong>Example-</strong></span></span></div><div style="line-height: 10.75pt;"><span style="color: #333333; font-family: 'Courier New';">Suppose  we have 100 properties files in an application. We have one thread that  can read properties file and return a map value. We want to optimize  the time to read all 10 properties file by using concurrent reading.  Here optimize means &#8211; we need a perfect balance between CPU Utilization  and total time consumed by reading process.</span></div><div style="line-height: 10.75pt;"><span style="color: #333333; font-family: 'Courier New';"><br /> </span></div><div style="color: #333333; line-height: 10.75pt;"><strong><span style="color: #333333; font-family: 'Courier New';">Pseudo code &#8211;&nbsp;</span>READER THREAD</strong></div><div style="color: #333333; line-height: 10.75pt;"><br /> </div><div style="color: #333333; line-height: 10.75pt;"><span style="color: #333333; font-family: 'Courier New';">Config Reader implements Callable&lt;Map&lt;String, String&gt;</span></div><div style="color: #333333; line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="color: #333333; font-family: 'Courier New';">try{</span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;<strong> &nbsp;</strong></span><span style="font-family: 'Courier New';"><span style="color: #38761d;"><strong>// Get the file name in the constructor of thread</strong></span></span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><span style="color: #38761d;"><strong>&nbsp;&nbsp; &nbsp;// Check if File exists</strong></span></span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><span style="color: #38761d;"><strong>&nbsp;&nbsp; &nbsp;// Read the file and retrun the map object</strong></span></span></div><div style="color: #333333; line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="color: #333333; font-family: 'Courier New';">}catch(Exception e){</span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><span style="color: #333333;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #38761d;">//release all the resource </span></strong></span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><strong><span style="color: #38761d;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //return null</span></strong></span></div><div style="color: #333333; line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="color: #333333; font-family: 'Courier New';">}</span></div><div style="color: #333333; line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="color: #333333; font-family: 'Courier New';"><br /> </span></div><div style="color: #333333; line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="color: #333333; font-family: 'Courier New';">Main THREAD-</span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><span style="color: #333333;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #38761d;">// Get a fixed thread pool from Executors</span></strong></span></div><div style="color: #333333; line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;try{</span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><span style="color: #333333;">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #38761d;">// Get the list of all properties file in the directory</span></strong></span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><strong><span style="color: #38761d;">&nbsp;&nbsp;&nbsp; // Create a READER THREAD by passing the name of file</span></strong></span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><strong><span style="color: #38761d;">&nbsp;&nbsp;&nbsp; // store the READER thread in the a list</span></strong></span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><strong><span style="color: #38761d;">&nbsp;&nbsp; &nbsp;//release all the thread in one go and get the Map objects</span></strong></span></div><div style="color: #333333; line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="color: #333333; font-family: 'Courier New';">}catch(Exception e){</span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><span style="color: #333333;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #38761d;">//release all the resources</span></strong></span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><strong><span style="color: #38761d;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // print the stack trace</span></strong></span></div><div style="color: #333333; line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="color: #333333; font-family: 'Courier New';">}finally{</span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="font-family: 'Courier New';"><span style="color: #333333;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #38761d;">//shutdown the thread pool</span></strong></span></div><span style="color: #333333; font-family: 'Courier New';">}</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.jovialjava.blog.threads;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.File;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.FileInputStream;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.ArrayList;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.List;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.Properties;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Callable;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ExecutorService;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Executors;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Future;<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Reader&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Reader(String&nbsp;name)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Properties&nbsp;call()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;f&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;prop&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Properties();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(f.exists()&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;f.canRead()&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;f.isFile())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;in&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileInputStream(f);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prop.load(in);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;prop;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Please&nbsp;check&nbsp;about&nbsp;this&nbsp;file:[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;f.getAbsolutePath()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;FixedThreadPoolExample&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;String&nbsp;directory&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">config</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;ExecutorService&nbsp;executorPool&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;dir&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(directory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(dir.isDirectory())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;fileList&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;files&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;dir.list();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Optimization&nbsp;-&nbsp;just&nbsp;20%&nbsp;of&nbsp;number&nbsp;of&nbsp;files.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Executors.newFixedThreadPool(files.length&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(String&nbsp;file&nbsp;:&nbsp;files)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;reader&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Reader(dir.getAbsolutePath()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;File.separator&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;file);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileList.add(reader);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Future</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;results&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;executorPool.invokeAll(fileList);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Check&nbsp;how&nbsp;many&nbsp;success&nbsp;and&nbsp;how&nbsp;many&nbsp;failure<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;success&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;failure&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(Future</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Properties</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;result&nbsp;:&nbsp;results)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(result.get()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;failure</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Total&nbsp;number&nbsp;of&nbsp;files&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;fileList.size()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Success&nbsp;Count&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;success&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Failure&nbsp;Count&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;failure&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;IllegalArgumentException(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">There&nbsp;is&nbsp;no&nbsp;such&nbsp;directory&nbsp;name&nbsp;-</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;directory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(executorPool&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool.shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div><img src ="http://www.blogjava.net/dashi99/aggbug/384882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:43 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 8: java.util.concurrent - "Executors" Factory Threads Pool</title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384881.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384881.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384881.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384881.html</trackback:ping><description><![CDATA[<div><div><span style="font-family: 'Courier New'; line-height: 115%;">Today in this article we will see some of threads pool available in <em><strong><u><span style="background-color: #ffe599; color: #cc0000; font-size: large;"><a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html">&#8220;Executors&#8221;</a></span></u></strong></em> Factory -</span></div><div><strong><span style="font-family: 'Courier New'; line-height: 115%;"><span style="font-size: large;">public static ExecutorService</span>&nbsp;</span></strong></div><div><strong><span style="font-family: 'Courier New'; line-height: 115%;"><span style="color: #cc0000; font-size: large;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newFixedThreadPool(int nThreads)</span></span></strong></div><div><span style="font-family: 'Courier New'; line-height: 115%;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span>Creates  a thread pool that reuses a fixed number of threads operating off a  shared unbounded queue. At any point, at most nThreads threads will be  active processing tasks. If additional tasks are submitted when all  threads are active, they will wait in the queue until a thread is  available. If any thread terminates due to a failure during execution  prior to shutdown, a new one will take its place if needed to execute  subsequent tasks. The threads in the pool will exist until it is  explicitly shutdown.</span></div><div><br /> </div><div><strong><span style="font-family: 'Courier New'; line-height: 115%;"><span style="font-size: large;">public static ScheduledExecutorService</span>&nbsp;</span></strong></div><div><strong><span style="font-family: 'Courier New'; line-height: 115%;"><span style="color: #cc0000; font-size: large;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;newScheduledThreadPool(int corePoolSize)</span></span></strong></div><div><span style="font-family: 'Courier New'; line-height: 115%;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span>Creates a thread pool that can schedule commands to run after a given delay, or to execute periodically.</span></div><div><br /> </div><div><strong><span style="font-family: 'Courier New'; line-height: 115%;"><span style="font-size: large;">public static ExecutorService</span><span style="color: #cc0000; font-size: large;"> newCachedThreadPool()</span></span></strong></div><div><span style="font-family: 'Courier New'; line-height: 115%;">Creates  a thread pool that creates new threads as needed, but will reuse  previously constructed threads when they are available. These pools will  typically improve the performance of programs that execute many  short-lived asynchronous tasks. Calls to execute will reuse previously  constructed threads if available. If no existing thread is available, a  new thread will be created and added to the pool. Threads that have not  been used for sixty seconds are terminated and removed from the cache.  Thus, a pool that remains idle for long enough will not consume any  resources. Note that pools with similar properties but different details  (for example, timeout parameters) may be created using  ThreadPoolExecutor constructors.</span></div><div><br /> </div><div><br /> </div><div><br /> </div><div><strong><span style="font-family: 'Courier New'; line-height: 115%;"><span style="font-size: large;">public static ExecutorService</span><span style="color: #cc0000; font-size: large;"> newSingleThreadExecutor()</span></span></strong></div><div><span style="font-family: 'Courier New'; line-height: 115%;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span>Creates  an Executor that uses a single worker thread operating off an unbounded  queue. (Note however that if this single thread terminates due to a  failure during execution prior to shutdown, a new one will take its  place if needed to execute subsequent tasks.) Tasks are guaranteed to  execute sequentially, and no more than one task will be active at any  given time. Unlike the otherwise equivalent newFixedThreadPool(1) the  returned executor is guaranteed not to be reconfigurable to use  additional threads.</span></div><div><br /> </div><div><strong><span style="font-family: 'Courier New'; line-height: 115%;"><span style="font-size: large;">public static ExecutorService</span><span style="color: #cc0000; font-size: large;"> newSingleThreadExecutor()</span></span></strong></div><span style="font-family: 'Courier New'; line-height: 115%;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span>Creates  an Executor that uses a single worker thread operating off an unbounded  queue. (Note however that if this single thread terminates due to a  failure during execution prior to shutdown, a new one will take its  place if needed to execute subsequent tasks.) Tasks are guaranteed to  execute sequentially, and no more than one task will be active at any  given time. Unlike the otherwise equivalent newFixedThreadPool(1) the  returned executor is guaranteed not to be reconfigurable to use  additional threads.</span></div><img src ="http://www.blogjava.net/dashi99/aggbug/384881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:41 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 7: java.util.concurrent - invokeAll via ExecutorService </title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384879.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384879.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384879.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384879.html</trackback:ping><description><![CDATA[<div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;" align="center"><strong><span style="color: #cc0000; font-family: 'Courier New'; font-size: large;">Submit Collection of Threads via ExecutorService</span></strong></div><br /> <div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">Today in next part of the series we will talk about How we can release multiple threads via Executor Interface.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="font-family: 'Courier New';">As per JAVA 6.0 docs &#8211;</span></strong></div><div style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&lt;T&gt; <a href="http://download.oracle.com/javase/6/docs/api/java/util/List.html" title="interface in java.util"><span style="color: #333333; text-decoration: none;">List</span></a>&lt;<a href="http://jovialjava.blogspot.com/2011/01/part-2-javautilconcurrent-future.html"><span style="color: #333333; text-decoration: none;">Future</span>&lt;T&gt;</a>&gt; <strong>invokeAll</strong>(<a href="http://download.oracle.com/javase/6/docs/api/java/util/Collection.html" title="interface in java.util"><span style="color: #333333; text-decoration: none;">Collection</span></a>&lt;? extends <a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Callable.html" title="interface in java.util.concurrent"><span style="color: #333333; text-decoration: none;">Callable</span></a>&lt;T&gt;&gt;&nbsp;tasks)</span><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throws <a href="http://download.oracle.com/javase/6/docs/api/java/lang/InterruptedException.html" title="class in java.lang"><span style="color: #333333; text-decoration: none;">InterruptedException</span></a></span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';"><br /> </span><span style="color: #333333; font-family: Arial, sans-serif;"><br /> </span><strong><u><span style="color: #00b050; font-family: 'Courier New';">In traditional Java</span></u></strong><span style="color: #333333; font-family: 'Courier New';">&nbsp;&#8211; If we have to release multiple threads- we have to create Thread objects and call </span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">Start method one by one.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><u><span style="color: #00b050; font-family: 'Courier New';">In Java 5.0 and above</span></u></strong><span style="color: #333333; font-family: 'Courier New';"> &#8211; If we can put all callable objects in a collection object and pass the collection objects to ExecutorService to release.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">For  example &#8211; If we have 1000 thread object to be released, we can create  an array list and an ExecutorService object with thread pool size of 20.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // create an ExecutorService object with thread pool size = 20</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // create an array List with 1000 callable objects.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Release all threads by ExecutorService.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';"><br /> </span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';"><u><strong>Some important points to note here are </strong></u></span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><ul><li><span style="color: #333333; font-family: Wingdings;">&#216;&nbsp;</span><span style="color: #333333; font-family: 'Courier New';">As ExecutorService has thread pool of 20, it will internally manage queuing and releasing of 1000 threads.</span></li><li><span style="color: #333333; font-family: Wingdings;">&#216;&nbsp;</span><em><span style="color: #333333; font-family: 'Courier New';">invokeAll</span></em><span style="color: #333333; font-family: 'Courier New';"> is a blocking method. It means &#8211; JVM won&#8217;t proceed to next line until all the 1000 threads are complete.</span></li><li><span style="color: #333333; font-family: Wingdings;">&#216;&nbsp;</span><span style="color: #333333; font-family: 'Courier New';">All the 1000 threads must have same Return Type &lt; T &gt;.</span></li><li><span style="color: #333333; font-family: Wingdings;">&#216;&nbsp;</span><em><span style="color: #333333; font-family: 'Courier New';"><a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html#isDone%28%29"><span style="color: #333333; text-decoration: none;">Future.isDone()</span></a></span></em><span style="color: #333333; font-family: 'Courier New';">&nbsp;is&nbsp;true&nbsp;for each element of the returned list</span></li><li><span style="color: #333333; font-family: Wingdings;">&#216;&nbsp;</span><span style="color: #333333; font-family: 'Courier New';">A&nbsp;<em>completed</em>&nbsp;thread  could have terminated either normally or by throwing an exception. In  both the case return type of Future.isDone( ) is true.</span></li><li><span style="color: #333333; font-family: Wingdings;">&#216;&nbsp;</span><span style="color: #333333; font-family: 'Courier New';">The results of this method are undefined if the given collection is modified while this operation is in progress</span></li><li><span style="color: #333333; font-family: Wingdings;">&#216;&nbsp;</span><span style="color: #333333; font-family: 'Courier New';">It can throw following exceptions &#8211;</span></li><li><span style="line-height: normal;"><strong><span style="color: #0033cc; font-family: 'Courier New';"><span style="color: #0033cc; text-decoration: none;">InterruptedException</span></span></strong></span><span style="line-height: normal;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;- if interrupted while waiting, in which case unfinished tasks are cancelled.</span></span></li><li><span style="line-height: normal;"><strong><span style="color: #0033cc; font-family: 'Courier New';"><span style="color: #0033cc; text-decoration: none;">NullPointerException</span></span></strong></span><span style="line-height: normal;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;- if tasks or any of its elements are&nbsp;null.</span></span></li><li><span style="line-height: normal;"><strong><span style="color: #0033cc; font-family: 'Courier New';"><span style="color: #0033cc; text-decoration: none;">RejectedExecutionException</span></span></strong></span><span style="line-height: normal;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;- if any task cannot be scheduled for execution.</span></span></li></ul><br /> <div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><strong><span style="color: #cc0000; font-family: 'Courier New';">EXAMPLE &#8211;</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #cc0000; font-family: 'Courier New';">Imagine a scenario, one needs to write create a txn file of each request coming to system. Following are the requirements-</span></div><ul><li><span style="color: #cc0000; font-family: Wingdings;">&#216;&nbsp;</span><span style="color: #cc0000; font-family: 'Courier New';">File name will be the client name.</span></li><li><span style="color: #cc0000; font-family: Wingdings;">&#216;&nbsp;</span><span style="color: #cc0000; font-family: 'Courier New';">At a time, almost 1000 clients could be connected at a time, so system must be capable of creating 1000 files in one go.</span></li><li><span style="color: #cc0000; font-family: Wingdings;">&#216;&nbsp;</span><span style="color: #cc0000; font-family: 'Courier New';">Process of creating one file should be less than 5 ms.</span></li><li><span style="color: #cc0000; font-family: Wingdings;">&#216;&nbsp;</span><span style="color: #cc0000; font-family: 'Courier New';">Total time of creating all the files should be less than 300 ms.</span></li></ul><br /> <div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="font-family: 'Courier New';">Let&#8217;s write the pseudo code for this case &#8211;</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;" align="center"><strong><span style="color: #cc0000; font-family: 'Courier New';">File creation Thread &#8211; implements CALLABLE&lt;Boolean&gt;</span></strong></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">// GET the File name and Raw Data in Constructor</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">Try{</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">// Create a File Object</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">// Create a print Writer Object</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">// Prepare the data and Write in the File</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">// Close the print Writer and File Object</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">// Return TRUE</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">} catch Exception {</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">return FALSE</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">}</span></div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><br /> </div><div style="line-height: 10.75pt; margin-bottom: 0.0001pt;"><span style="color: #333333; font-family: 'Courier New';"><span style="color: black; font-family: 'Times New Roman';"><strong><span style="color: #cc0000; font-family: 'Courier New';">Main Parent Thread</span></strong></span></span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;// -- In the Loop for whole Client list ---</span><span style="color: #333333; font-family: Arial, sans-serif;"><br /> </span><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp; &nbsp;try{</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // create a file creator thread &#8211; Pass filename and raw Data</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">// add the thread object into an Array List</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">// Pass the array list to Executor Service interface and invokeAll.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">// <a href="http://jovialjava.blogspot.com/2011/01/part-2-javautilconcurrent-future.html">Loop in the Future&lt;Boolean&gt;</a> and check how many threads completed successfully.</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">&nbsp;&nbsp;}catch Exception{</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">// Take necessary action</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in;"><span style="color: #333333; font-family: 'Courier New';">}finally{</span></div><div style="line-height: 10.75pt; margin-bottom: .0001pt; margin-bottom: 0in; text-indent: .5in;"><span style="color: #333333; font-family: 'Courier New';">// Shut down the ExecutorService</span><span style="color: #333333; font-family: Arial, sans-serif;"><br /> </span><span style="color: #333333; font-family: 'Courier New';">&nbsp;}</span></div></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.jovialjava.blog.threads;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.File;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.PrintWriter;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.</span><span style="color: #000000; ">*</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.</span><span style="color: #000000; ">*</span><span style="color: #000000; ">;<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;FILE&nbsp;CREATOR&nbsp;THREAD</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;FileTask&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Boolean</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;data&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;FileTask(String&nbsp;name,&nbsp;String&nbsp;data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.data&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Boolean&nbsp;call()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;writer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;PrintWriter(file);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.write(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;MAIN&nbsp;THREAD</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;InvokeAllExample&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;ExecutorService&nbsp;executorPool&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Executors.newFixedThreadPool(</span><span style="color: #000000; ">20</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;NO_OF_CLIENT&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;FILE_EXT&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.txt</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;String&nbsp;TXN_DATA&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SOME&nbsp;RANDOM&nbsp;TXN&nbsp;DATA&nbsp;FOR&nbsp;CLIENT&nbsp;--&gt;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;String&nbsp;DIRECTORY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">EXAMPLE</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;File.separator;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(DIRECTORY).isDirectory())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(DIRECTORY).mkdir();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;success&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;failure&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Lets&nbsp;assume&nbsp;we&nbsp;have&nbsp;1000&nbsp;clients&nbsp;connected&nbsp;and&nbsp;sending&nbsp;request&nbsp;at&nbsp;a<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;time.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">FileTask</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;collection&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">FileTask</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;NO_OF_CLIENT;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileTask&nbsp;task&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileTask(DIRECTORY&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;Integer.toString(i)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;FILE_EXT,&nbsp;TXN_DATA&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;collection.add(task);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;startTime&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Date().getTime();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Future</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Boolean</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;list&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;executorPool.invokeAll(collection);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(Future</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Boolean</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;fut&nbsp;:&nbsp;list)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ignore&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;fut.get()&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;success</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;:&nbsp;failure</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">TOTAL&nbsp;SUCCESS&nbsp;-&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;success);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">TOTAL&nbsp;FAILURE&nbsp;-&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;failure);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Total&nbsp;time&nbsp;-&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Date().getTime()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;startTime)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;ms</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool.shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;End&nbsp;of&nbsp;Main</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />}<br /></span></div><img src ="http://www.blogjava.net/dashi99/aggbug/384879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:40 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 6: java.util.concurrent - Lock and Condition Object </title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384878.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384878.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384878.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384878.html</trackback:ping><description><![CDATA[<div><span style="font-family: 'Courier New', Courier, monospace;">Today in next part of the series we will talk about How to communicate among threads using Lock and Condition Objects.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><br /> </span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><strong>In traditional Java</strong> - If we need to communicate among threads, we syncronize code and use "wait" and "notify" methods &nbsp;of Object class.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><strong>From Java 5.0 and above</strong> - <strong><span style="color: #cc0000;">Lock interface provides an easier implmentation for synchronization and Condition class can be used to wait and notify threads.</span></strong></span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><br /> </span><br /> <span style="font-family: 'Courier New', Courier, monospace;">Lock  has several important methods such as "lock", "tryLock",  "lockInterruptibly" etc, whereas Condition has "await", "signal",  'signalAll" etc. In this article we will demonstrate the usage of 3  methods - "lock" (from Lock interface), "await", "signal" (from  Condition Class).</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><br /> </span><br /> <span style="font-family: 'Courier New', Courier, monospace;">Lets  try to visualize a scenario here - Assume we have 2 process "Reader"  and "Writer". Writer writes on a file and Reader reads from a file. we  want to add a listener to writer object so that whenever writer writes  anything on a file, "Reader" will be called and it will read the same  data. Before we look into codes lets look at the some important points  to use Lock and Condition-</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><br /> </span><br /> <span style="font-family: 'Courier New', Courier, monospace;">1) Lock is an <strong>Interface</strong>, the most common implementation class is <strong><span style="color: #cc0000;">ReentrantLock</span></strong>. Others two are - ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">2) <strong>Condition Object is always retrieved from Lock object</strong>. For example - Condition condition = lock.newCondition( );</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">3) One of the best practice to use Lock is-</span><br /> <div><span style="font-family: 'Courier New', Courier, monospace;"> <span style="color: #38761d;">Lock lockObj = new ReentrantLock( );</span></span></div><div><span style="color: #38761d; font-family: 'Courier New', Courier, monospace;"> &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lockObj.lock( );</span></div><div><span style="color: #38761d;"><span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try{</span></span></div><div><span style="color: #38761d; font-family: 'Courier New', Courier, monospace;"> .... code..</span></div><div><span style="color: #38761d;"><span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }finally{</span></span></div><div><span style="color: #38761d; font-family: 'Courier New', Courier, monospace;"> &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lockObj.unlock( );</span></div><div><span style="color: #38761d;"><span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></span></div><span style="font-family: 'Courier New', Courier, monospace;">4)  condition.await, condition.signal, condition.signalAll methods should  only be called once you have acquired the lock by - lockObj.lock( ).</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">In our example, the design of the class will be something like this -</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&gt; One lock Object == fileLock</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&gt; One condition Object = condition = fileLock.newCondition</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><br /> </span><br /> <div><span style="font-family: 'Courier New', Courier, monospace;"><strong><span style="color: #cc0000;">Pseudo code&nbsp;for Writer Thread</span></strong>&nbsp;</span></div><span style="font-family: 'Courier New', Courier, monospace;">// GET the LOCK</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">try{</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp;// -- In &nbsp;the Loop untill EXIT---</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp; &nbsp; //Write on the file</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp; &nbsp; // Signal the READER</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp; &nbsp; //If EXIT signal then exit else "WAIT for READER to SIGNAL"</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;}finally{</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp;// RELEASE the LOCK</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;}</span><br /> <div><span style="font-family: 'Courier New', Courier, monospace;"><strong><span style="color: #cc0000;">pseudo code for Reader Thread</span></strong>&nbsp;</span></div><span style="font-family: 'Courier New', Courier, monospace;">// GET the LOCK</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">try{</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp;// -- In &nbsp;the Loop untill EXIT---</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp; &nbsp; //Read from the file</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp; &nbsp; // Signal the WRITER</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp; &nbsp; // If EXIT signal - then exit else "WAIT for WRITER to SIGNAL"</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;}finally{</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp;// RELEASE the LOCK</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;}</span><br /> <div><br /> </div></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.jovialjava.blog.threads;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.BufferedReader;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.File;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.FileReader;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.PrintWriter;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.security.SecureRandom;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ExecutorService;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Executors;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.locks.Condition;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.locks.Lock;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.locks.ReentrantLock;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;LockExample&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;fileName&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">LockExample.txt</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;EXIT_FLAG&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">BYE</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;NO_OF_LINES&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;Lock&nbsp;fileLock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ReentrantLock();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;Condition&nbsp;condition&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;fileLock.newCondition();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;ExecutorService&nbsp;executorPool&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Executors.newFixedThreadPool(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runnable&nbsp;fileWriter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileWrite();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runnable&nbsp;fileReader&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileRead();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool.submit(fileReader);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool.submit(fileWriter);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool.shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;thread&nbsp;will&nbsp;write&nbsp;on&nbsp;a&nbsp;file&nbsp;and&nbsp;inform&nbsp;the&nbsp;reader&nbsp;thread&nbsp;to&nbsp;read&nbsp;it.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;If&nbsp;it&nbsp;has&nbsp;not&nbsp;written&nbsp;the&nbsp;EXIT&nbsp;flag&nbsp;then&nbsp;it&nbsp;will&nbsp;go&nbsp;into&nbsp;wait&nbsp;stage&nbsp;and<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;will&nbsp;wait&nbsp;for&nbsp;READER&nbsp;to&nbsp;signal&nbsp;that&nbsp;it&nbsp;safe&nbsp;to&nbsp;write&nbsp;now.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;FileWrite&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Runnable&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileLock.lock();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;NO_OF_LINES;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;writer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;PrintWriter(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(fileName));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(i&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;NO_OF_LINES&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;random&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;SecureRandom().nextInt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WRITER&nbsp;WRITING&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;random);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.println(random);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;signallng&nbsp;to&nbsp;READER&nbsp;that&nbsp;its&nbsp;safe&nbsp;to&nbsp;read&nbsp;now.</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condition.signal();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Writer&nbsp;waiting</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condition.await();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.println(EXIT_FLAG);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WRITER&nbsp;EXITING&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;AS&nbsp;it&nbsp;was&nbsp;an&nbsp;exit&nbsp;flag&nbsp;so&nbsp;no&nbsp;need&nbsp;to&nbsp;wait,&nbsp;just<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;signal&nbsp;the&nbsp;reader.</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condition.signal();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">!!!!!!!!!!!!!!!!!!!!!!!!EXCEPTION!!!!!!!!!!!!!!!!!!!!!!!!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileLock.unlock();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Delete&nbsp;the&nbsp;file,&nbsp;require&nbsp;in&nbsp;case&nbsp;if&nbsp;one&nbsp;wants&nbsp;to&nbsp;run&nbsp;demo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;again.</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(fileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.delete();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.createNewFile();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;thread&nbsp;will&nbsp;read&nbsp;from&nbsp;the&nbsp;file&nbsp;and&nbsp;inform&nbsp;the&nbsp;writer&nbsp;thread&nbsp;to&nbsp;write<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;again.&nbsp;If&nbsp;it&nbsp;has&nbsp;not&nbsp;read&nbsp;the&nbsp;EXIT&nbsp;flag&nbsp;then&nbsp;it&nbsp;will&nbsp;go&nbsp;into&nbsp;wait&nbsp;stage<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;and&nbsp;will&nbsp;wait&nbsp;for&nbsp;WRITER&nbsp;to&nbsp;signal&nbsp;that&nbsp;it&nbsp;safe&nbsp;to&nbsp;read&nbsp;now.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;FileRead&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Runnable&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;data&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileLock.lock();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;reader&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileReader(fileName));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;reader.readLine();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">READ&nbsp;DATA&nbsp;-&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(data&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">data.equals(EXIT_FLAG))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condition.signalAll();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Reader&nbsp;Waiting</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condition.await();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">READER&nbsp;EXITING</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condition.signal();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">!!!!!!!!!!!!!!!!!!!!!!!!EXCEPTION!!!!!!!!!!!!!!!!!!!!!!!!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileLock.unlock();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div><img src ="http://www.blogjava.net/dashi99/aggbug/384878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:38 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 5: java.util.concurrent - Submit Callable&lt; T &gt; via ExecutorService</title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384877.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384877.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384877.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384877.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384877.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384877.html</trackback:ping><description><![CDATA[<div><div><span style="color: #cc0000; font-family: 'Courier New', Courier, monospace; font-size: large;"><strong>Future&lt;T&gt; submit(Callable&lt;T&gt; c)</strong></span></div><span style="font-family: 'Courier New', Courier, monospace;">Today in next part of the series we will talk about submission of callable task via executor service.&nbsp;</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"></span><br /> <span style="font-family: 'Courier New', Courier, monospace;">As per JAVA version 6.0, ExecutorService Interface has following method -</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><span style="background-color: #ffe599;">Future&lt; T &gt; &nbsp;submit( callable c )</span> </span><br /> <ol><li><span style="font-family: 'Courier New', Courier, monospace;"><strong>Submits a Callable task for execution and returns a Future representing that task computation.</strong></span></li><li><strong><span style="font-family: 'Courier New', Courier, monospace;">Future&lt; T &gt; will return T on successful&nbsp;completion&nbsp;of the process, otherwise result will not be T.</span></strong></li></ol> <span style="font-family: 'Courier New', Courier, monospace;">Lets start with Callable task - As we &nbsp;know that Callable&lt;T&gt; interface has following method - </span><span style="font-family: 'Courier New', Courier, monospace;"><strong>public T call()</strong></span><br /> <span style="font-family: 'Courier New', Courier, monospace;">So  when we say - ExecutorService.submit(Callable Task) --&gt; It starts a  new stack starting with call method of callable task, as call method can  return T so does future object. Due to this reason the signature of  submit(Callable c) is Future&lt; T &gt;.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">T --&gt; means anything that extends Object.</span><br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.jovialjava.blog.threads;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Callable;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ExecutionException;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ExecutorService;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Executors;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Future;<br /><br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;CallableExample&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;ExecutorService&nbsp;executorPool</span><span style="color: #000000; ">=</span><span style="color: #000000; ">Executors.newFixedThreadPool(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CallableTask_1&nbsp;task_1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;CallableTask_1();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CallableTask_2&nbsp;task_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;CallableTask_2();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Submit&nbsp;the&nbsp;first&nbsp;task<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Future</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Boolean</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;fut_1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;executorPool.submit(task_1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Future</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Boolean</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;fut_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;executorPool.submit(task_2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(fut_1.get()){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">TASK&nbsp;1&nbsp;completed&nbsp;SUCCESSFULLY</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(fut_2.get()){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">TASK&nbsp;2&nbsp;completed&nbsp;SUCCESSFULLY</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">(ExecutionException&nbsp;e){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">(InterruptedException&nbsp;e){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">====VERY&nbsp;IMPORTANT===<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;is&nbsp;required&nbsp;to&nbsp;stop&nbsp;the&nbsp;executor&nbsp;pool&nbsp;to<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;stop&nbsp;accepting&nbsp;new&nbsp;request.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool.shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;task&nbsp;will&nbsp;complete&nbsp;successfully<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;CallableTask_1&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Boolean</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Boolean&nbsp;call()</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;NullPointerException{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hi,&nbsp;Inside&nbsp;Callable&nbsp;Task&nbsp;1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;task&nbsp;will&nbsp;result&nbsp;in&nbsp;error.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;CallableTask_2&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Boolean</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Boolean&nbsp;call()</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;NullPointerException{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hi,&nbsp;Inside&nbsp;Callable&nbsp;Task&nbsp;2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;IllegalStateException(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Callable&nbsp;Task&nbsp;Exception</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div></div><img src ="http://www.blogjava.net/dashi99/aggbug/384877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:35 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 4: java.util.concurrent - Submit Runnable via ExecutorService</title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384875.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384875.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384875.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384875.html</trackback:ping><description><![CDATA[<div><div><span style="color: #cc0000; font-family: 'Courier New', Courier, monospace; font-size: large;"><strong><u>Future&lt;?&gt; submit( Runnable r )</u></strong></span></div><span style="font-family: 'Courier New', Courier, monospace;">Today  in part 4 of the series we will talk about submission of runnable task  via executor service. This method can be very&nbsp;beneficial&nbsp;if someone  wants to upgrade legacy code from 1.4 to 1.5 onwards.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">As per JAVA version 6.0, ExecutorService Interface has following method -</span><br /> <div><span style="font-family: 'Courier New', Courier, monospace;">Future&lt; ? &gt; &nbsp;submit( Runnable r )&nbsp;</span></div><span style="font-family: 'Courier New', Courier, monospace;"> &nbsp;&nbsp;&gt;&nbsp;<strong>Submits a Runnable task for execution and returns a Future representing that task.</strong></span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><strong> &nbsp;&nbsp;&gt;&nbsp;This method will return NULL on successful completeion of the process, otherwise result will not be null</strong>.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><br /> </span><br /> <span style="font-family: 'Courier New', Courier, monospace;">Lets start with Runnable task - As we &nbsp;know that Runnable interface has following method -&nbsp;</span><span style="font-family: 'Courier New', Courier, monospace;">public void run()</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">So  when we say - ExecutorService.submit(Runnable Task) --&gt; It starts a  new stack starting with run method of runnable task, but as run method  can not return any value&nbsp;</span><span style="font-family: 'Courier New', Courier, monospace;">so does future object. Due to this reason the signature of submit(Runnable r) is Future&lt; ? &gt;.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">? --&gt; means anything that extends Object, has no lower limit</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.jovialjava.blog.threads;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ExecutionException;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ExecutorService;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Executors;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Future;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;RunnableExample&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;ExecutorService&nbsp;executorPool</span><span style="color: #000000; ">=</span><span style="color: #000000; ">Executors.newFixedThreadPool(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RunnableTask_1&nbsp;task_1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;RunnableTask_1();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RunnableTask_2&nbsp;task_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;RunnableTask_2();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Submit&nbsp;the&nbsp;first&nbsp;task<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Future</span><span style="color: #000000; ">&lt;?&gt;</span><span style="color: #000000; ">&nbsp;fut_1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;executorPool.submit(task_1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Future</span><span style="color: #000000; ">&lt;?&gt;</span><span style="color: #000000; ">&nbsp;fut_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;executorPool.submit(task_2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(fut_1.get()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">TASK&nbsp;1&nbsp;completed&nbsp;SUCCESSFULLY</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(fut_2.get()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">TASK&nbsp;2&nbsp;completed&nbsp;SUCCESSFULLY</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">(ExecutionException&nbsp;e){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">(InterruptedException&nbsp;e){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">====VERY&nbsp;IMPORTANT===<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;is&nbsp;required&nbsp;to&nbsp;stop&nbsp;the&nbsp;executor&nbsp;pool&nbsp;to<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;stop&nbsp;accepting&nbsp;new&nbsp;request.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool.shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;task&nbsp;will&nbsp;complete&nbsp;successfully<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;RunnableTask_1&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Runnable{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;NullPointerException{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hi,&nbsp;Inside&nbsp;Runnable&nbsp;Task&nbsp;1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;task&nbsp;will&nbsp;result&nbsp;in&nbsp;error.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;RunnableTask_2&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Runnable{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;NullPointerException{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hi,&nbsp;Inside&nbsp;Runnable&nbsp;Task&nbsp;2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;IllegalStateException(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Runnable&nbsp;Task&nbsp;Exception</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div><img src ="http://www.blogjava.net/dashi99/aggbug/384875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:33 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 3:java.util.concurrent- ExecutorService Interface </title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384874.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384874.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384874.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384874.html</trackback:ping><description><![CDATA[<div><div dir="ltr"><span style="font-family: 'Courier New',Courier,monospace;">xecutorService interface provide us a base to release threads. It maintains everything related to threads.</span><br /> <span style="font-family: 'Courier New',Courier,monospace;"><strong><u><span style="color: #cc0000; font-size: large;">Analogy</span></u></strong>:</span><br /> <span style="font-family: 'Courier New',Courier,monospace;">This  is very much similar to a small IT organization where a project manager  handles all activities related to developers. Activities such as -</span><span style="font-family: 'Courier New',Courier,monospace;">how many person will be there in each team, if one team has less work then releasing some person from that team and shifting to&nbsp;</span><span style="font-family: 'Courier New',Courier,monospace;">another team, generate weekly report to submit to company etc.</span>&nbsp;<br /> <span style="font-family: 'Courier New',Courier,monospace;">If we see deeply -<strong>functions of ExecutorService</strong> are nothing but an exact replica of <strong>what a project manager does in a company</strong>.</span><br /> <span style="font-family: 'Courier New',Courier,monospace;">We create thread task , ExecutorService helps to release a thread and give the result back to us&nbsp;</span><span style="font-family: 'Courier New',Courier,monospace;">similarly company hires a person and project manager takes out the work from that person and company gets benefited.</span><br /> <span style="color: #cc0000; font-family: 'Courier New',Courier,monospace; font-size: large;"><strong><u>Threads Pool in ExecutorService Implementation:</u></strong></span><br /> <span style="font-family: 'Courier New',Courier,monospace;">Most  of the executor implementations in java.util.concurrent use thread  pools, which consist of worker threads. This kind of thread exists  separately from the Runnable and Callable tasks it executes and is often  used to execute multiple tasks.</span><br /> <span style="font-family: 'Courier New',Courier,monospace;">Using  worker threads minimizes the overhead due to thread creation. Thread  objects use a significant amount of memory, and in a large-scale  application, allocating and deallocating many thread objects creates a  significant memory management overhead.</span><br /> <span style="font-family: 'Courier New',Courier,monospace;"><strong><u><span style="color: #cc0000; font-size: large;">Analogy</span></u></strong>:</span><br /> <span style="font-family: 'Courier New',Courier,monospace;">This  is very much similar to big organizations in which a project manager  have project leaders working under him to take care of developers. so  project leaders are nothing but acting as thread POOL.</span><br /> <span style="color: #cc0000; font-family: 'Courier New',Courier,monospace; font-size: large;"><strong><u>Fixed Thread POOL:</u></strong></span><br /> <span style="font-family: 'Courier New',Courier,monospace;">One  common type of thread pool is the fixed thread pool. This type of pool  always has a specified number of threads running; if a thread is somehow  terminated while it is still in use, it is automatically replaced with a  new thread. Tasks are submitted to the pool via an internal queue,  which holds extra tasks whenever there are more active tasks than  threads.</span><br /> <span style="color: #cc0000; font-family: 'Courier New',Courier,monospace; font-size: large;"><strong><u>Advantage:</u></strong></span><br /> <span style="font-family: 'Courier New',Courier,monospace;">An important advantage of the fixed thread pool is that applications using it degrade gracefully. <strong>To  understand this, consider a web server application where each HTTP  request is handled by a separate thread. If the application simply  creates a new thread for every new HTTP request, and the system receives  more requests than it can handle immediately, the application will  suddenly stop responding to all requests when the overhead of all those  threads exceed the capacity of the system. With a limit on the number of  the threads that can be created, the application will not be servicing  HTTP requests as quickly as they come in, but it will be servicing them  as quickly as the system can sustain.&nbsp;</strong></span><br /> <span style="color: #cc0000; font-family: 'Courier New',Courier,monospace; font-size: large;"><strong><u>Example-</u></strong></span><br /> <span style="font-family: 'Courier New',Courier,monospace;">Suppose there are 8 threads in the Thread Pool.&nbsp;</span><br /> <span style="font-family: 'Courier New',Courier,monospace;">First request comes in the queue : check if there is any Thread in the pool --&gt; Yes , execute the task.</span><br /> <span style="font-family: 'Courier New',Courier,monospace;">9th  request comes &nbsp;in : No thread in pool currently --&gt; Hold the task in  the queue( Degrading the performance) --&gt; wait until one among the  currently running 8 task finishes --&gt; as soon as one finished, run  the ninth task ( graceful work)</span><br /> <span style="font-family: 'Courier New',Courier,monospace;"><br /> </span><br /> <strong><span style="background-color: #ffd966; color: #cc0000;"><span style="font-family: 'Courier New',Courier,monospace;">ExecutorServiceInterface -</span><span style="font-family: 'Courier New',Courier,monospace;">Important Methods</span></span></strong><br /> <span style="font-family: 'Courier New',Courier,monospace;"><br /> </span><br /> <span style="font-family: 'Courier New',Courier,monospace;"><strong>Provide <span style="color: #38761d;">submit(&#8230;)</span> in spite of <span style="background-color: white;"><span style="color: #38761d;">execute(&#8230;)</span></span></strong></span><br /> <span style="font-family: 'Courier New',Courier,monospace;"><strong><span style="color: #38761d;">submit( Runnable &nbsp; &nbsp;r)</span> --&gt; <span style="color: #38761d;">return Future&lt; ? &gt;</span></strong></span><br /> <span style="font-family: 'Courier New',Courier,monospace;"><strong><span style="color: #38761d;">submit( Callable&lt;V&gt; c)</span> --&gt; <span style="color: #38761d;">return Future&lt;T&gt;</span></strong></span><br /> <span style="font-family: 'Courier New',Courier,monospace;"><strong><span style="color: #38761d;">invokeAll( Collection&lt; ? extends Callable&lt;T&gt;&gt; task )</span> --&gt; <span style="color: #38761d;">List&lt;Future&lt;T&gt;&gt;</span></strong></span><br /> <span style="font-family: 'Courier New',Courier,monospace;"><strong><span style="color: #38761d;">shutdownNow( )</span> --&gt; <span style="color: #38761d;">List&lt;Runnable&gt;</span></strong></span></div></div><img src ="http://www.blogjava.net/dashi99/aggbug/384874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:30 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 2: java.util.concurrent - Future &lt;T&gt;</title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384873.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384873.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384873.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384873.html</trackback:ping><description><![CDATA[<div><span style="color: #cc0000; font-family: 'Courier New', Courier, monospace; font-size: large;"><strong><u>Future&lt;T&gt;:</u></strong></span><br /> <span style="font-family: 'Courier New', Courier, monospace;">A  Future represents the result of an asynchronous computation. Future has  been provide with some really powerful methods. For Instance -</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">1) We can check whether a task has been completed or not.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">2) We can cancel a task.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">3) Check whether task was cancelled or complete normally.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><br /> </span><br /> <span style="color: #cc0000; font-family: 'Courier New', Courier, monospace;"><strong><u>Methods-</u></strong></span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><br /> </span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><strong><span style="background-color: #ffe599; color: #38761d;">boolean cancel(boolean mayInterruptIfRunning)</span></strong> -&nbsp;</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">This method does following -</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">1) If the process(Thread) has not started, then cancel the thread.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">2) If the process has started, then check if&nbsp;</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"> mayInterruptIfRunning = true ==&gt; Inturrept the thread and cancel it</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"> mayInterruptIfRunning = false ==&gt; Let it run</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">This  attempt will fail if the task has already completed, has already been  cancelled, or could not be cancelled for some other reason.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">After this method returns, subsequent calls to isDone() will always return true.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;">Subsequent calls to isCancelled() will always return true if this method returned true.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><br /> </span><br /> <span style="color: #38761d; font-family: 'Courier New', Courier, monospace;"><strong style="background-color: #ffe599;">boolean isCancelled()</strong></span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp; &nbsp;Returns true if this task was cancelled before it completed normally</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><br /> </span><br /> <span style="color: #38761d; font-family: 'Courier New', Courier, monospace;"><strong style="background-color: #ffe599;">V get() throws InterruptedException, ExecutionException</strong></span><br /> <span style="font-family: 'Courier New', Courier, monospace;"> This  method is a blocking call. It will cause JVM to wait if necessary for  the computation to complete, and then retrieves its result.</span><br /> <span style="font-family: 'Courier New', Courier, monospace;"><br /> </span><br /> <span style="color: #38761d; font-family: 'Courier New', Courier, monospace;"><strong style="background-color: #ffe599;">boolean isDone()</strong></span><br /> <span style="font-family: 'Courier New', Courier, monospace;">&nbsp;&nbsp;  &nbsp;Returns true if this task completed. Completion may be due to normal  termination, an exception, or cancellation - in all of these cases, this  method will return true.</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.jovialjava.blog.threads;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Callable;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ExecutorService;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Executors;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Future;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;FutureExample&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Executor&nbsp;pool&nbsp;is&nbsp;a&nbsp;new&nbsp;concept&nbsp;in&nbsp;JAVA&nbsp;5+,&nbsp;it&nbsp;can&nbsp;help&nbsp;to&nbsp;release&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;a&nbsp;thread.&nbsp;It&nbsp;maintains&nbsp;a&nbsp;pool&nbsp;of&nbsp;threads,&nbsp;It&nbsp;reuses&nbsp;them,&nbsp;also&nbsp;align&nbsp;them&nbsp;in&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;a&nbsp;queue.&nbsp;Here&nbsp;we&nbsp;are&nbsp;creating&nbsp;pool&nbsp;of&nbsp;1&nbsp;thread.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;ExecutorService&nbsp;executorPool</span><span style="color: #000000; ">=</span><span style="color: #000000; ">Executors.newFixedThreadPool(</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;args){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CallableTask&nbsp;call&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;CallableTask();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Future&lt;T&gt;&nbsp;is&nbsp;result&nbsp;of&nbsp;asynchronous&nbsp;computation.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;It&nbsp;may&nbsp;possible&nbsp;that&nbsp;CallableTask&nbsp;has&nbsp;not&nbsp;started&nbsp;yet<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;but&nbsp;'ExecutorService'&nbsp;gives&nbsp;the&nbsp;result&nbsp;via&nbsp;Future<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Object.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Future</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;future&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;executorPool.submit(call);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;We&nbsp;can&nbsp;check&nbsp;if&nbsp;CallableTask&nbsp;has&nbsp;been&nbsp;completed.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Status&nbsp;of&nbsp;Callable&nbsp;Task&nbsp;[Is&nbsp;Completed&nbsp;?&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;future.isDone()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;We&nbsp;can&nbsp;get&nbsp;the&nbsp;result&nbsp;of&nbsp;callable&nbsp;Task.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Note&nbsp;:&nbsp;future.get()&nbsp;is&nbsp;a&nbsp;blocking&nbsp;call,&nbsp;It&nbsp;will&nbsp;wait&nbsp;until&nbsp;the&nbsp;associated&nbsp;process&nbsp;finishes.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Result&nbsp;of&nbsp;callable&nbsp;task&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;future.get()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;We&nbsp;can&nbsp;cancel&nbsp;the&nbsp;task.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Trying&nbsp;to&nbsp;cancel&nbsp;the&nbsp;task&nbsp;[Is&nbsp;Cancelled&nbsp;?&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;future.cancel(</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;We&nbsp;can&nbsp;see&nbsp;if&nbsp;the&nbsp;task&nbsp;was&nbsp;canceled.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;true&nbsp;if&nbsp;this&nbsp;task&nbsp;was&nbsp;canceled&nbsp;before&nbsp;it&nbsp;completed&nbsp;normally<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Was&nbsp;task&nbsp;canceled&nbsp;before&nbsp;normal&nbsp;complition&nbsp;?&nbsp;-</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;future.isCancelled());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">(Exception&nbsp;e){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorPool.shutdownNow();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*Callable&lt;V&gt;&nbsp;is&nbsp;defined&nbsp;as&nbsp;Callable&lt;String&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;CallableTask&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;call(&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Inside&nbsp;CALLABLE&nbsp;TASK</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">~~JOVIAL&nbsp;JAVA~~</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /></span></div><img src ="http://www.blogjava.net/dashi99/aggbug/384873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:28 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Part 1: java.util.concurrent - Runnable Vs Callable in Java </title><link>http://www.blogjava.net/dashi99/archive/2012/08/06/384871.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 06 Aug 2012 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/06/384871.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384871.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/06/384871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384871.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384871.html</trackback:ping><description><![CDATA[<div><div style="color: #cc0000; font-family: &quot;Courier New&quot;,Courier,monospace;"><u><span style="font-size: large;"><strong>About Runnable:</strong></span></u></div><div style="font-family: &quot;Courier New&quot;,Courier,monospace;">Runnable  interface is implemented by the Thread class as well and it's a common  protocol for all the objects who wish to execute in a different thread.  It's one of the ways of creating threads in Java. The other way to  create a thread is by subclassing the Thread class. A class implementing  Runnable interface can simply pass itself to create a Thread instance  and can run thereafter. This eliminates the need of subclassing the  Thread class for the purpose of executing the code in a separate thread.</div><div style="font-family: &quot;Courier New&quot;,Courier,monospace;">As  long as we don't wish to override other methods of the Thread class, it  may be a better idea to implement the Runnable interface to enable  multithreading capabilities to a class than enabling the same by  extending the Thread class.</div><div style="font-family: &quot;Courier New&quot;,Courier,monospace;"><br /> </div><div style="color: #cc0000; font-family: &quot;Courier New&quot;,Courier,monospace;"><span style="font-size: large;"><u><strong>About Callable:</strong></u></span></div><div style="font-family: &quot;Courier New&quot;,Courier,monospace;">The  designers of Java felt a need of extending the capabilities of the  Runnable interface, but they didn't want to affect the uses of the  Runnable interface and probably that was the reason why they went for  having a separate interface named Callable in Java 1.5 than changing the  already existing Runnable interface which has been a part of Java since  Java 1.0.</div><div style="font-family: &quot;Courier New&quot;,Courier,monospace;"><br /> </div><div style="color: #cc0000; font-family: &quot;Courier New&quot;,Courier,monospace;"><u><strong>Similarities:</strong></u></div><div style="font-family: &quot;Courier New&quot;,Courier,monospace;">1) Both threads can be used to cause a separate stack for a thread. </div><div style="font-family: &quot;Courier New&quot;,Courier,monospace;"><br /> </div><div style="font-family: &quot;Courier New&quot;,Courier,monospace;">2) Both has only one method : Inside Runnable it is called as </div><div style="font-family: &quot;Courier New&quot;,Courier,monospace;">public abstract void run( );</div><div style="font-family: &quot;Courier New&quot;,Courier,monospace;">Inside callable the method is being called as </div><div style="font-family: &quot;Courier New&quot;,Courier,monospace;">public abstract  call() ;<br /> (Note : V can be any valid object in JAVA)<br /> <br /> <u style="color: #cc0000;"><strong>Differences:</strong></u><br /> <br /> 1) Return Type -<br /> public abstract void run()  --&gt; Return type "void"<br /> public abstract  call()  --&gt; Return type "Any valid JAVA Object"<br /> <br /> 2) Run method can not throw any checked Exception, whereas<br /> public abstract  call() throw checkedException<br /> Call method can throw any checked Exception.</div></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.jovialjava.blog.threads;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.Callable;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.FutureTask;<br /><br /></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;This&nbsp;program&nbsp;has&nbsp;been&nbsp;written&nbsp;to&nbsp;demonstrate&nbsp;the&nbsp;usage<br />&nbsp;*&nbsp;of&nbsp;Runnable&nbsp;and&nbsp;Callable&lt;String&gt;&nbsp;Interfaces.&nbsp;Jovial&nbsp;Java&nbsp;makes<br />&nbsp;*&nbsp;no&nbsp;guarantee&nbsp;of&nbsp;any&nbsp;harm&nbsp;or&nbsp;any&nbsp;problem&nbsp;caused&nbsp;by&nbsp;using&nbsp;this&nbsp;<br />&nbsp;*&nbsp;program.<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Run_Vs_Call&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />args){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CallableTask&nbsp;call&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;CallableTask();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RunnableTask&nbsp;run&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;RunnableTask();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;We&nbsp;need&nbsp;a&nbsp;Future&nbsp;task&nbsp;Launcher&nbsp;to&nbsp;launch&nbsp;Callable&nbsp;Class<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FutureTask</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;callTask&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FutureTask</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(call);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;We&nbsp;need&nbsp;a&nbsp;Thread&nbsp;Launcher&nbsp;to&nbsp;to&nbsp;launch&nbsp;Runnable&nbsp;Class<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;runTask&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Thread(run);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callTask.run();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;runTask.start();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Get&nbsp;is&nbsp;a&nbsp;blocking&nbsp;call,&nbsp;JVM&nbsp;will&nbsp;wait&nbsp;here&nbsp;until&nbsp;Call&nbsp;task<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;finishes&nbsp;execution.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(callTask.get());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">(Exception&nbsp;e){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*Callable&lt;V&gt;&nbsp;is&nbsp;defined&nbsp;as&nbsp;Callable&lt;String&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;CallableTask&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Callable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;call(&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Inside&nbsp;call&nbsp;method..!!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Runnable&nbsp;Interface&nbsp;Implementation<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;RunnableTask&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Runnable{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Inside&nbsp;Run&nbsp;Method,&nbsp;I&nbsp;can&nbsp;not&nbsp;return&nbsp;any&nbsp;thing</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /></span></div><img src ="http://www.blogjava.net/dashi99/aggbug/384871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-08-06 10:24 <a href="http://www.blogjava.net/dashi99/archive/2012/08/06/384871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件追加内容实例</title><link>http://www.blogjava.net/dashi99/archive/2012/07/03/382109.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 03 Jul 2012 11:10:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/07/03/382109.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/382109.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/07/03/382109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/382109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/382109.html</trackback:ping><description><![CDATA[文件追加内容实例
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.duke.java.util;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.FileWriter;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.IOException;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.RandomAccessFile;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_144_1631_Open_Image" onclick="this.style.display='none'; Codehighlighter1_144_1631_Open_Text.style.display='none'; Codehighlighter1_144_1631_Closed_Image.style.display='inline'; Codehighlighter1_144_1631_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_144_1631_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_144_1631_Closed_Text.style.display='none'; Codehighlighter1_144_1631_Open_Image.style.display='inline'; Codehighlighter1_144_1631_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AppendToFile&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_144_1631_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_144_1631_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_147_191_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_191_Open_Text.style.display='none'; Codehighlighter1_147_191_Closed_Image.style.display='inline'; Codehighlighter1_147_191_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_147_191_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_147_191_Closed_Text.style.display='none'; Codehighlighter1_147_191_Open_Image.style.display='inline'; Codehighlighter1_147_191_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_147_191_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_147_191_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;A方法追加文件：使用RandomAccessFile<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_263_692_Open_Image" onclick="this.style.display='none'; Codehighlighter1_263_692_Open_Text.style.display='none'; Codehighlighter1_263_692_Closed_Image.style.display='inline'; Codehighlighter1_263_692_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_263_692_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_263_692_Closed_Text.style.display='none'; Codehighlighter1_263_692_Open_Image.style.display='inline'; Codehighlighter1_263_692_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;appendMethodA(String&nbsp;fileName,&nbsp;String&nbsp;content)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_263_692_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_263_692_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_277_619_Open_Image" onclick="this.style.display='none'; Codehighlighter1_277_619_Open_Text.style.display='none'; Codehighlighter1_277_619_Closed_Image.style.display='inline'; Codehighlighter1_277_619_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_277_619_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_277_619_Closed_Text.style.display='none'; Codehighlighter1_277_619_Open_Image.style.display='inline'; Codehighlighter1_277_619_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_277_619_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_277_619_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;打开一个随机访问文件流，按读写方式</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomAccessFile&nbsp;randomFile&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;RandomAccessFile(fileName,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">rw</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;文件长度，字节数</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;fileLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;randomFile.length();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">将写文件指针移到文件尾。</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;randomFile.seek(fileLength);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;randomFile.writeBytes(content);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;randomFile.close();<br /><img id="Codehighlighter1_643_686_Open_Image" onclick="this.style.display='none'; Codehighlighter1_643_686_Open_Text.style.display='none'; Codehighlighter1_643_686_Closed_Image.style.display='inline'; Codehighlighter1_643_686_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_643_686_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_643_686_Closed_Text.style.display='none'; Codehighlighter1_643_686_Open_Image.style.display='inline'; Codehighlighter1_643_686_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(IOException&nbsp;e)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_643_686_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_643_686_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img id="Codehighlighter1_699_737_Open_Image" onclick="this.style.display='none'; Codehighlighter1_699_737_Open_Text.style.display='none'; Codehighlighter1_699_737_Closed_Image.style.display='inline'; Codehighlighter1_699_737_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_699_737_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_699_737_Closed_Text.style.display='none'; Codehighlighter1_699_737_Open_Image.style.display='inline'; Codehighlighter1_699_737_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_699_737_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_699_737_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;B方法追加文件：使用FileWriter<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_809_1082_Open_Image" onclick="this.style.display='none'; Codehighlighter1_809_1082_Open_Text.style.display='none'; Codehighlighter1_809_1082_Closed_Image.style.display='inline'; Codehighlighter1_809_1082_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_809_1082_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_809_1082_Closed_Text.style.display='none'; Codehighlighter1_809_1082_Open_Image.style.display='inline'; Codehighlighter1_809_1082_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;appendMethodB(String&nbsp;fileName,&nbsp;String&nbsp;content)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_809_1082_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_809_1082_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_823_1009_Open_Image" onclick="this.style.display='none'; Codehighlighter1_823_1009_Open_Text.style.display='none'; Codehighlighter1_823_1009_Closed_Image.style.display='inline'; Codehighlighter1_823_1009_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_823_1009_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_823_1009_Closed_Text.style.display='none'; Codehighlighter1_823_1009_Open_Image.style.display='inline'; Codehighlighter1_823_1009_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_823_1009_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_823_1009_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">打开一个写文件器，构造函数中的第二个参数true表示以追加形式写文件</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileWriter&nbsp;writer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileWriter(fileName,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.write(content);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.close();<br /><img id="Codehighlighter1_1033_1076_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1033_1076_Open_Text.style.display='none'; Codehighlighter1_1033_1076_Closed_Image.style.display='inline'; Codehighlighter1_1033_1076_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1033_1076_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1033_1076_Closed_Text.style.display='none'; Codehighlighter1_1033_1076_Open_Image.style.display='inline'; Codehighlighter1_1033_1076_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(IOException&nbsp;e)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1033_1076_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1033_1076_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img id="Codehighlighter1_1128_1629_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1128_1629_Open_Text.style.display='none'; Codehighlighter1_1128_1629_Closed_Image.style.display='inline'; Codehighlighter1_1128_1629_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1128_1629_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1128_1629_Closed_Text.style.display='none'; Codehighlighter1_1128_1629_Open_Image.style.display='inline'; Codehighlighter1_1128_1629_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1128_1629_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1128_1629_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C:/Shawn/test.txt</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;content&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">new&nbsp;append!</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">按方法A追加文件</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AppendToFile.appendMethodA(fileName,&nbsp;content);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AppendToFile.appendMethodA(fileName,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">append&nbsp;end.&nbsp;\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">显示文件内容</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReadFromFile.readFileByLines(fileName);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">按方法B追加文件</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AppendToFile.appendMethodB(fileName,&nbsp;content);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AppendToFile.appendMethodB(fileName,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">append&nbsp;end.&nbsp;\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">显示文件内容</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReadFromFile.readFileByLines(fileName);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div><br /><img src ="http://www.blogjava.net/dashi99/aggbug/382109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-07-03 19:10 <a href="http://www.blogjava.net/dashi99/archive/2012/07/03/382109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件读取实例</title><link>http://www.blogjava.net/dashi99/archive/2012/07/03/382108.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 03 Jul 2012 11:07:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/07/03/382108.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/382108.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/07/03/382108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/382108.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/382108.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 读取文件实例 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package&nbsp;org.duke.java.util;import&nbsp;java.io.BufferedReader;import&nbsp;java.io.File;i...&nbsp;&nbsp;<a href='http://www.blogjava.net/dashi99/archive/2012/07/03/382108.html'>阅读全文</a><img src ="http://www.blogjava.net/dashi99/aggbug/382108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-07-03 19:07 <a href="http://www.blogjava.net/dashi99/archive/2012/07/03/382108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to Create Client/Server Keystores using Java Keytool</title><link>http://www.blogjava.net/dashi99/archive/2012/06/26/381538.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 26 Jun 2012 11:15:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/06/26/381538.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/381538.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/06/26/381538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/381538.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/381538.html</trackback:ping><description><![CDATA[<div>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Here I have described how to create client/server keystores which can be used to secure Axsi2 webservices and invoke Axis2 secured webservices. i.e. It can be easily used with any <a href="http://wso2.com/products">WSO2 Product</a> to experience security scenarios.More detailed explanation on creating client/server keystores using openssl including Certificate Authority(CA) Requests, can be found at <a href="http://wso2.org/library/174">http://wso2.org/library/174</a>.</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">&nbsp;</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Java keytool stores the keys and certificates in a keystore, protected by a keystore password. Further, it protects private key again with another password. A Java keystore contains private-public key pair and multiple trusted certificate entries. All entries in a keystore are referred by aliases. Both private key and self signed public key is referred by one alias while any other trusted certificates are referred by different individual aliases.</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">&nbsp;</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">As the first step, let's create a keystore for server. In order to do it, execute following command in a terminal. "server" in the following command corresponds to the private key/self signed public key certificate alias in the keystore while "server.jks" is the name of the creating keystore file.</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt"><span style="font-weight:bold">keytool -genkey -alias server -keyalg RSA -keystore server.jks</span></p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">when you execute the above command it will first prompt you to specify a password which is corresponded to the keystore password. Then it will prompt several questions. You can give answers that you wish. At the end it will ask for a password again, which will be used to secure the generated private key.</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Enter keystore password:&nbsp;<br /> Re-enter new password: <br /> What is your first and last name?<br /> [Unknown]:&nbsp;Ruchira Wageesha<br /> What is the name of your organizational unit?<br /> [Unknown]:&nbsp;Mashup Server<br /> What is the name of your organization?<br /> [Unknown]:&nbsp;WSO2<br /> What is the name of your City or Locality?<br /> [Unknown]:&nbsp;Ahangama<br /> What is the name of your State or Province?<br /> [Unknown]:&nbsp;Southern<br /> What is the two-letter country code for this unit?<br /> [Unknown]:&nbsp;LK<br /> Is CN=Ruchira Wageesha, OU=Mashup Server, O=WSO2, L=Ahangama, ST=Southern, C=LK correct?<br /> [no]: yes<br /> Enter key password for <br /> (RETURN if same as keystore password):</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Once you successfully completed this, java keytool will create a file named "server.jks". In the same way, you can create a client keystore named "client.jks" with the alias "client" using following command.</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt"><span style="font-weight:bold">keytool -genkey -alias client -keyalg RSA -keystore client.jks</span></p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Now, you have two files named client.jks and server.jks. You can view the content of these keystore files using the following command. Replacess "ruchira" with the keystore password you entered while creating the keystore.</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt"><span style="font-weight:bold">keytool -list -v -keystore server.jks -storepass ruchira</span></p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">This will list something like this.</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Keystore type: JKS<br /> Keystore provider: SUN</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Your keystore contains 1 entry</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Alias name: server<br /> Creation date: Jul 8, 2010<br /> Entry type: PrivateKeyEntry<br /> Certificate chain length: 1<br /> Certificate[1]:<br /> Owner: CN=Ruchira Wageesha, OU=Mashup Server, O=WSO2, L=Ahangama, ST=Southern, C=LK<br /> Issuer: CN=Ruchira Wageesha, OU=Mashup Server, O=WSO2, L=Ahangama, ST=Southern, C=LK<br /> Serial number: 4c356225<br /> Valid from: Thu Jul 08 10:59:09 IST 2010 until: Wed Oct 06 10:59:09 IST 2010<br /> Certificate fingerprints:<br /> MD5:&nbsp;60:0B:48:0D:DB:56:8C:68:8C:2D:94:4A:D6:DA:04:B8<br /> SHA1: A7:CE:57:10:70:87:C1:2C:C0:9D:1D:90:8C:BB:69:B6:66:26:97:13<br /> Signature algorithm name: SHA1withRSA<br /> Version: 3</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">*******************************************<br /> *******************************************</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">The next step is, getting server's self signed public key certificate and storing it in client's keystore. And getting and storing client's self signed public key certificate in server's keystore. In order to do that, first we need to export both server and client public key certificates into files. Using the following command, you can export server's public key certificate into server.cert file and client's public key certificate into client.cert file.</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt"><span style="font-weight:bold">keytool -export -file server.cert -keystore server.jks -storepass ruchira -alias server</span><br /> <span style="font-weight:bold">keytool -export -file client.cert -keystore client.jks -storepass ruchira -alias client</span></p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Now you have server.cert and client.cert. You can use following commands to view certificate contents.</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt"><span style="font-weight:bold">keytool -printcert -v -file server.cert<br /> keytool -printcert -v -file client.cert</span></p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">As the last step, we need to import server.cert into client keystore and client.cert into server keystore. As I mentioned earlier, each entry of a Java Keystore is stored against an alias. So, we need to specify aliases here, which will be used to refer the certificates that we are going to store.</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt"><span style="font-weight:bold">keytool -import -file client.cert -keystore server.jks -storepass ruchira -alias client</span></p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Above command will store client's self signed public key certificate(client.cert) in server.jks against the alias "client". So, using "client" alias on server.jks, we can refer client's certificate anytime. Likewise, following command will store server.cert within client.jks against the alias "server".</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt"><span style="font-weight:bold">keytool -import -file server.cert -keystore client.jks -storepass ruchira -alias server</span></p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">After all, please view the content of both keystore again using following commands.</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt"><span style="font-weight:bold">keytool -list -v -keystore server.jks -storepass ruchira<br /> keytool -list -v -keystore client.jks -storepass ruchira</span></p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">It will give you something like bellow for server.jks</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Keystore type: JKS<br /> Keystore provider: SUN</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Your keystore contains 2 entries</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Alias name: server<br /> Creation date: Jul 8, 2010<br /> Entry type: PrivateKeyEntry<br /> Certificate chain length: 1<br /> Certificate[1]:<br /> Owner: CN=Ruchira Wageesha, OU=Mashup Server, O=WSO2, L=Ahangama, ST=Southern, C=LK<br /> Issuer: CN=Ruchira Wageesha, OU=Mashup Server, O=WSO2, L=Ahangama, ST=Southern, C=LK<br /> Serial number: 4c3562a0<br /> Valid from: Thu Jul 08 11:01:12 IST 2010 until: Wed Oct 06 11:01:12 IST 2010<br /> Certificate fingerprints:<br /> MD5:&nbsp;AB:77:72:F1:0D:09:55:E3:B6:D3:DC:A6:4D:D4:39:36<br /> SHA1: D7:C1:60:5C:7E:34:40:A9:0B:E4:2C:65:6C:E0:79:7C:EE:37:A7:19<br /> Signature algorithm name: SHA1withRSA<br /> Version: 3</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">*******************************************<br /> *******************************************</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Alias name: client<br /> Creation date: Jul 8, 2010<br /> Entry type: trustedCertEntry</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Owner: CN=Ruchira Wageesha, OU=Mashup Server, O=WSO2, L=Ahangama, ST=Southern, C=LK<br /> Issuer: CN=Ruchira Wageesha, OU=Mashup Server, O=WSO2, L=Ahangama, ST=Southern, C=LK<br /> Serial number: 4c356225<br /> Valid from: Thu Jul 08 10:59:09 IST 2010 until: Wed Oct 06 10:59:09 IST 2010<br /> Certificate fingerprints:<br /> MD5:&nbsp;60:0B:48:0D:DB:56:8C:68:8C:2D:94:4A:D6:DA:04:B8<br /> SHA1: A7:CE:57:10:70:87:C1:2C:C0:9D:1D:90:8C:BB:69:B6:66:26:97:13<br /> Signature algorithm name: SHA1withRSA<br /> Version: 3</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">*******************************************<br /> *******************************************</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">something like below for client.jks</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Keystore type: JKS<br /> Keystore provider: SUN</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Your keystore contains 2 entries</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Alias name: server<br /> Creation date: Jul 8, 2010<br /> Entry type: trustedCertEntry</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Owner: CN=Ruchira Wageesha, OU=Mashup Server, O=WSO2, L=Ahangama, ST=Southern, C=LK<br /> Issuer: CN=Ruchira Wageesha, OU=Mashup Server, O=WSO2, L=Ahangama, ST=Southern, C=LK<br /> Serial number: 4c3562a0<br /> Valid from: Thu Jul 08 11:01:12 IST 2010 until: Wed Oct 06 11:01:12 IST 2010<br /> Certificate fingerprints:<br /> MD5:&nbsp;AB:77:72:F1:0D:09:55:E3:B6:D3:DC:A6:4D:D4:39:36<br /> SHA1: D7:C1:60:5C:7E:34:40:A9:0B:E4:2C:65:6C:E0:79:7C:EE:37:A7:19<br /> Signature algorithm name: SHA1withRSA<br /> Version: 3</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">*******************************************<br /> *******************************************</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">Alias name: client<br /> Creation date: Jul 8, 2010<br /> Entry type: PrivateKeyEntry<br /> Certificate chain length: 1<br /> Certificate[1]:<br /> Owner: CN=Ruchira Wageesha, OU=Mashup Server, O=WSO2, L=Ahangama, ST=Southern, C=LK<br /> Issuer: CN=Ruchira Wageesha, OU=Mashup Server, O=WSO2, L=Ahangama, ST=Southern, C=LK<br /> Serial number: 4c356225<br /> Valid from: Thu Jul 08 10:59:09 IST 2010 until: Wed Oct 06 10:59:09 IST 2010<br /> Certificate fingerprints:<br /> MD5:&nbsp;60:0B:48:0D:DB:56:8C:68:8C:2D:94:4A:D6:DA:04:B8<br /> SHA1: A7:CE:57:10:70:87:C1:2C:C0:9D:1D:90:8C:BB:69:B6:66:26:97:13<br /> Signature algorithm name: SHA1withRSA<br /> Version: 3</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">*******************************************<br /> *******************************************</p>  <p style="margin:0in;font-family:Calibri;font-size:12.0pt">If everything went well, you might have successfully created server.jks and client.jks which can be used to secure Axis2 Services and access those secured services. </p>  </div><img src ="http://www.blogjava.net/dashi99/aggbug/381538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-06-26 19:15 <a href="http://www.blogjava.net/dashi99/archive/2012/06/26/381538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Using Java Reflection</title><link>http://www.blogjava.net/dashi99/archive/2012/06/26/381535.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 26 Jun 2012 11:04:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/06/26/381535.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/381535.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/06/26/381535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/381535.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/381535.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Reflection is a feature in the Java programming language. It allows an executing Java program to examine or "introspect" upon itself, and manipulate internal properties of the program. For example, it...&nbsp;&nbsp;<a href='http://www.blogjava.net/dashi99/archive/2012/06/26/381535.html'>阅读全文</a><img src ="http://www.blogjava.net/dashi99/aggbug/381535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2012-06-26 19:04 <a href="http://www.blogjava.net/dashi99/archive/2012/06/26/381535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat 配置用户</title><link>http://www.blogjava.net/dashi99/archive/2009/11/09/301717.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 09 Nov 2009 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2009/11/09/301717.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/301717.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2009/11/09/301717.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/301717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/301717.html</trackback:ping><description><![CDATA[&lt;tomcat-users&gt;<br />
<br />
&lt;role rolename="tomcat"/&gt;<br />
&lt;role rolename="rolel"/&gt;<br />
&lt;role rolename="manager"/&gt;<br />
&lt;role rolename="admin"/&gt;<br />
<br />
&lt;user username="tomcat" password="tomcat" roles="tomcat"/&gt;<br />
&lt;user username="both" password="tomcat" roles="tomcat,rolel"/&gt;<br />
&lt;user username="rolel" password="tomcat" roles="rolel"/&gt;<br />
&lt;user username="manager" password="manager" roles="manager"/&gt;<br />
&lt;user username="admin" password="admin" roles="admin,manager"/&gt;<br />
<br />
&lt;/tomcat-users&gt;<br />
<img src ="http://www.blogjava.net/dashi99/aggbug/301717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2009-11-09 16:32 <a href="http://www.blogjava.net/dashi99/archive/2009/11/09/301717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse中10个比较有用的快捷键组合(转)</title><link>http://www.blogjava.net/dashi99/archive/2009/06/02/279599.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 02 Jun 2009 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2009/06/02/279599.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/279599.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2009/06/02/279599.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/279599.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/279599.html</trackback:ping><description><![CDATA[一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合。通过这些组合可以更加容易的浏览源代码，使得整体的开发效率和质量得到提升。
<p><strong>&nbsp;&nbsp;&nbsp; 1. ctrl+shift+r：打开资源</strong></p>
<p>&nbsp;&nbsp;&nbsp; 这可能是所有快捷键组合中最省时间的了。这组快捷键可以让你打开你的工作区中任何一个文件，而你只需要按下文件名或mask名中的前几个字母，比如applic*.xml。美中不足的是这组快捷键并非在所有视图下都能用。</p>
<p align="center"><span class="Apple-style-span" style="word-spacing: 0px; font: 12px/19px 'Trebuchet MS'; text-transform: none; color: rgb(102,102,102); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0" twffan="done"><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200905/20090521092247938.gif" twffan="done" /></span></p>
<p><strong>&nbsp;&nbsp;&nbsp; 2. ctrl+o：快速outline</strong></p>
<p>&nbsp;&nbsp;&nbsp; 如果想要查看当前类的方法或某个特定方法，但又不想把代码拉上拉下，也不想使用查找功能的话，就用ctrl+o吧。它可以列出当前类中的所有方法及属性，你只需输入你想要查询的方法名，点击enter就能够直接跳转至你想去的位置。</p>
<p align="center"><span class="Apple-style-span" style="word-spacing: 0px; font: 12px/19px 'Trebuchet MS'; text-transform: none; color: rgb(102,102,102); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: center; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0" twffan="done"><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200905/20090521092248145.gif" twffan="done" /></span></p>
<p><strong>&nbsp;&nbsp;&nbsp; 3. ctrl+e：快速转换编辑器</strong></p>
<p>&nbsp;&nbsp;&nbsp; 这组快捷键将帮助你在打开的编辑器之间浏览。使用ctrl+page down或ctrl+page up可以浏览前后的选项卡，但是在很多文件打开的状态下，ctrl+e会更加有效率。</p>
<p align="center"><span class="Apple-style-span" style="word-spacing: 0px; font: 12px/19px 'Trebuchet MS'; text-transform: none; color: rgb(102,102,102); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: center; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0" twffan="done"><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200905/20090521092248844.gif" twffan="done" /></span></p>
<p><strong>&nbsp;&nbsp;&nbsp; 4. ctrl+2，L：为本地变量赋值</strong></p>
<p>&nbsp;&nbsp;&nbsp; 开发过程中，我常常先编写方法，如Calendar.getInstance()，然后通过ctrl+2快捷键将方法的计算结果赋值于一个本地变量之上。这样我节省了输入类名，变量名以及导入声明的时间。Ctrl+F的效果类似，不过效果是把方法的计算结果赋值于类中的域。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 5. alt+shift+r：重命名</strong></p>
<p>&nbsp;&nbsp;&nbsp; 重命名属性及方法在几年前还是个很麻烦的事，需要大量使用搜索及替换，以至于代码变得零零散散的。今天的Java IDE提供源码处理功能，Eclipse也是一样。现在，变量和方法的重命名变得十分简单，你会习惯于在每次出现更好替代名称的时候都做一次重命名。要使用这个功能，将鼠标移动至属性名或方法名上，按下alt+shift+r，输入新名称并点击回车。就此完成。如果你重命名的是类中的一个属性，你可以点击alt+shift+r两次，这会呼叫出源码处理对话框，可以实现get及set方法的自动重命名。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 6. alt+shift+l以及alt+shift+m：提取本地变量及方法</strong></p>
<p>&nbsp;&nbsp;&nbsp; 源码处理还包括从大块的代码中提取变量和方法的功能。比如，要从一个string创建一个常量，那么就选定文本并按下alt+shift+l即可。如果同一个string在同一类中的别处出现，它会被自动替换。方法提取也是个非常方便的功能。将大方法分解成较小的、充分定义的方法会极大的减少复杂度，并提升代码的可测试性。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 7. shift+enter及ctrl+shift+enter</strong></p>
<p>&nbsp;&nbsp;&nbsp; Shift+enter在当前行之下创建一个空白行，与光标是否在行末无关。Ctrl+shift+enter则在当前行之前插入空白行。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 8. Alt+方向键</strong></p>
<p>&nbsp;&nbsp;&nbsp; 这也是个节省时间的法宝。这个组合将当前行的内容往上或下移动。在try/catch部分，这个快捷方式尤其好使。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 9. ctrl+m</strong></p>
<p>&nbsp;&nbsp;&nbsp; 大显示屏幕能够提高工作效率是大家都知道的。Ctrl+m是编辑器窗口最大化的快捷键。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 10. ctrl+.及ctrl+1：下一个错误及快速修改</strong></p>
<p>&nbsp;&nbsp;&nbsp; ctrl+.将光标移动至当前文件中的下一个报错处或警告处。这组快捷键我一般与ctrl+1一并使用，即修改建议的快捷键。新版Eclipse的修改建议做的很不错，可以帮你解决很多问题，如方法中的缺失参数，throw/catch exception，未执行的方法等等。</p>
<p align="center"><img style="width: 622px; height: 167px" height="276" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200905/20090521092248748.gif" width="902" twffan="done" /></a></p>
<p>&nbsp;&nbsp;&nbsp; 更多快捷键组合可在Eclipse按下ctrl+shift+L查看。</p>
<br />
转自：http://www.blogjava.net/Werther/archive/2009/06/02/279574.html
<img src ="http://www.blogjava.net/dashi99/aggbug/279599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2009-06-02 14:55 <a href="http://www.blogjava.net/dashi99/archive/2009/06/02/279599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 * 打印出各种图形</title><link>http://www.blogjava.net/dashi99/archive/2009/06/02/279595.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 02 Jun 2009 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2009/06/02/279595.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/279595.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2009/06/02/279595.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/279595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/279595.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 先看效果：代码：public&nbsp;class&nbsp;PrintTriangle&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/dashi99/archive/2009/06/02/279595.html'>阅读全文</a><img src ="http://www.blogjava.net/dashi99/aggbug/279595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2009-06-02 14:43 <a href="http://www.blogjava.net/dashi99/archive/2009/06/02/279595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jconsole</title><link>http://www.blogjava.net/dashi99/archive/2009/05/06/269238.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Wed, 06 May 2009 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2009/05/06/269238.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/269238.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2009/05/06/269238.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/269238.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/269238.html</trackback:ping><description><![CDATA[<p>jconsole 可以很方便的监控本机的所有 Java 应用和远程的应用.</p>
<p><strong>监控本地应用</strong></p>
<p>&nbsp;首先就是启动您要监控的应用, 例如我用 JDK 1.6 来启动了 Tomcat, 或者 Eclipse 也可以, 可以在任务管理器(Ctrl+Alt+Del可以调出来, 或者在任务栏点击右键)里看到进程ID, 例如我这里是 6132.</p>
<p>接着在 JDK 安装目录中(&lt;JDK_HOME&gt;/bin/jconsole.exe)启动 jconsole.exe (双击或者在 cmd 里面敲入 jconsole), 主界面会提示您建立一个新连接:</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image06.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="507" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image0_thumb2.png" width="473" border="0"  alt="" /></a> </p>
<p>可以看到进程ID, 选择它, 然后点击"连接". 这些 ID 必须都是用 JDK 1.6 的 java.exe 启动的, 否则在列表里看不到.</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image09.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="543" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image0_thumb3.png" width="746" border="0"  alt="" /></a> </p>
<p>JConsle 能监控内存,线程,类的数目和CPU然后点击各个 Tab 可以看到详细的输出, 详细的输出包括:<br />
内存: 堆/非堆, 峰值, 内存的各个部分, 例如 Perm, Eden 等的大小曲线图.<br />
线程: 峰值, 所有线程的列表, 堆栈跟踪(哪个对象中的线程)等. 还可以强制执行GC.<br />
类: 峰值, 类总数曲线图.<br />
MBean: 一些 JVM 参数的详细 MBean 信息.</p>
<p><strong>监控远程进程</strong></p>
<p>首先需要在运行的应用上启用远程管理, 参数如下(简单期间就不加用户验证了):<br />
java -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar ../demo/jfc/Java2D/Java2Demo.jar</p>
<p>然后连接的时候选择远程进程, 地址输入:</p>
<p>localhost:1090</p>
<p>即可.当然在别的电脑上(一般是局域网)可以输入那个电脑的IP.</p>
<p>综述: 使用 JConsole 可以简单的监控 Server 状态, 但是本身要占一定的资源, 不过 JVM 自带的监控, 理论上讲应该是占资源很小很小的, 可以用它来方便的了解 Web 服务器应用进程的状态. 如果要调优应用, 还是使用 JProfiler 等工具更好一些, 当然它们占的资源也更大.</p>
<img src ="http://www.blogjava.net/dashi99/aggbug/269238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2009-05-06 14:47 <a href="http://www.blogjava.net/dashi99/archive/2009/05/06/269238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再谈类的初始化</title><link>http://www.blogjava.net/dashi99/archive/2009/03/31/263130.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 31 Mar 2009 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2009/03/31/263130.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/263130.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2009/03/31/263130.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/263130.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/263130.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节，Google 了一遍网络，有关类装载机制的文章倒是不少，然而类初始化和对象初始化的文章并不多，特别是从字节码和 JVM 层次来分析的文章更是鲜有所见。本文主要对类和对象初始化全过程进行分析，通过一个实际问题引入，将源代码转换成 JVM 字节码后，对 JVM 执行过程的关键点进行全面解析，并在文中穿插入了相关 JVM 规范...&nbsp;&nbsp;<a href='http://www.blogjava.net/dashi99/archive/2009/03/31/263130.html'>阅读全文</a><img src ="http://www.blogjava.net/dashi99/aggbug/263130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2009-03-31 15:17 <a href="http://www.blogjava.net/dashi99/archive/2009/03/31/263130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类的 初始化顺序</title><link>http://www.blogjava.net/dashi99/archive/2009/03/30/262821.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 30 Mar 2009 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2009/03/30/262821.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/262821.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2009/03/30/262821.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/262821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/262821.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000"><br />
<img id="Codehighlighter1_13_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_13_137_Open_Text.style.display='none'; Codehighlighter1_13_137_Closed_Image.style.display='inline'; Codehighlighter1_13_137_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_13_137_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_13_137_Closed_Text.style.display='none'; Codehighlighter1_13_137_Open_Image.style.display='inline'; Codehighlighter1_13_137_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ClassA</span><span id="Codehighlighter1_13_137_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_13_137_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_22_67_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_67_Open_Text.style.display='none'; Codehighlighter1_22_67_Closed_Image.style.display='inline'; Codehighlighter1_22_67_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_22_67_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_22_67_Closed_Text.style.display='none'; Codehighlighter1_22_67_Open_Image.style.display='inline'; Codehighlighter1_22_67_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span id="Codehighlighter1_22_67_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_22_67_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">ClassA's&nbsp;static.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_85_135_Open_Image" onclick="this.style.display='none'; Codehighlighter1_85_135_Open_Text.style.display='none'; Codehighlighter1_85_135_Closed_Image.style.display='inline'; Codehighlighter1_85_135_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_85_135_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_85_135_Closed_Text.style.display='none'; Codehighlighter1_85_135_Open_Image.style.display='inline'; Codehighlighter1_85_135_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ClassA()</span><span id="Codehighlighter1_85_135_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_85_135_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">ClassA's&nbsp;constructor.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_166_290_Open_Image" onclick="this.style.display='none'; Codehighlighter1_166_290_Open_Text.style.display='none'; Codehighlighter1_166_290_Closed_Image.style.display='inline'; Codehighlighter1_166_290_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_166_290_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_166_290_Closed_Text.style.display='none'; Codehighlighter1_166_290_Open_Image.style.display='inline'; Codehighlighter1_166_290_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ClassB&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ClassA</span><span id="Codehighlighter1_166_290_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_166_290_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_175_220_Open_Image" onclick="this.style.display='none'; Codehighlighter1_175_220_Open_Text.style.display='none'; Codehighlighter1_175_220_Closed_Image.style.display='inline'; Codehighlighter1_175_220_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_175_220_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_175_220_Closed_Text.style.display='none'; Codehighlighter1_175_220_Open_Image.style.display='inline'; Codehighlighter1_175_220_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span id="Codehighlighter1_175_220_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_175_220_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">ClassB's&nbsp;static.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_238_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_238_288_Open_Text.style.display='none'; Codehighlighter1_238_288_Closed_Image.style.display='inline'; Codehighlighter1_238_288_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_238_288_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_238_288_Closed_Text.style.display='none'; Codehighlighter1_238_288_Open_Image.style.display='inline'; Codehighlighter1_238_288_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ClassB()</span><span id="Codehighlighter1_238_288_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_238_288_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">ClassB's&nbsp;constructor.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_315_452_Open_Image" onclick="this.style.display='none'; Codehighlighter1_315_452_Open_Text.style.display='none'; Codehighlighter1_315_452_Closed_Image.style.display='inline'; Codehighlighter1_315_452_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_315_452_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_315_452_Closed_Text.style.display='none'; Codehighlighter1_315_452_Open_Image.style.display='inline'; Codehighlighter1_315_452_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestClass&nbsp;</span><span id="Codehighlighter1_315_452_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_315_452_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_358_449_Open_Image" onclick="this.style.display='none'; Codehighlighter1_358_449_Open_Text.style.display='none'; Codehighlighter1_358_449_Closed_Image.style.display='inline'; Codehighlighter1_358_449_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_358_449_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_358_449_Closed_Text.style.display='none'; Codehighlighter1_358_449_Open_Image.style.display='inline'; Codehighlighter1_358_449_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_358_449_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_358_449_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassA&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassB();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">===============</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassB();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
输出：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">ClassA</span><span style="color: #000000">'</span><span style="color: #000000">s&nbsp;static.</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">ClassB</span><span style="color: #000000">'</span><span style="color: #000000">s&nbsp;static.</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">ClassA</span><span style="color: #000000">'</span><span style="color: #000000">s&nbsp;constructor.</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">ClassB</span><span style="color: #000000">'</span><span style="color: #000000">s&nbsp;constructor.</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">===============</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />ClassA</span><span style="color: #000000">'</span><span style="color: #000000">s&nbsp;constructor.</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">ClassB</span><span style="color: #000000">'</span><span style="color: #000000">s&nbsp;constructor.</span></div>
我个人分析如下： <br />
当执行到ClassA a = new ClassB();时开始加载ClassB，这里因为ClassB继承ClassA，所以加载ClassA，在加载ClassA的时候执行输出：ClassA's static.。 <br />
ClassA加载完后，加载ClassB，这时执行结果为：ClassB's static.。两个类都加载完后开始构建对象。 <br />
在构建ClassB对象时，得先构建父类对象ClassA，所以执行分别为：ClassA's constructor.<br />
ClassB's constructor.那么这句话完了。<br />
&nbsp;<br />
到a=new ClassB();时，由于ClassA，ClassB已经被加载过，在内存中。所以只是简单的进行构建对象。输出：ClassA's constructor.<br />
ClassB's constructor.<br />
希望大家多多指教。(来源于网络)
 <img src ="http://www.blogjava.net/dashi99/aggbug/262821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2009-03-30 09:59 <a href="http://www.blogjava.net/dashi99/archive/2009/03/30/262821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优秀程序员的十个习惯(摘)</title><link>http://www.blogjava.net/dashi99/archive/2009/03/23/261442.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 23 Mar 2009 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2009/03/23/261442.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/261442.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2009/03/23/261442.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/261442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/261442.html</trackback:ping><description><![CDATA[<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
<p>在
这个世界上，有数百万的人热衷于软件开发，他们有很多名字，如：软件工程师（Software
Engineer），程序员（Programmer），编码人（Coder），开发人员（Developer）。经过一段时间后，这些人能够成为一个优秀
的编码人员，他们非常熟悉如何用计算机语言来完成自己的工作。但是，如果你要成为一个优秀的程序员，你还可以需要有几件事你需要注意，如果你能让下面十个
条目成为你的习惯，那么你才能真正算得上是优秀程序员。</p>
<p>1. <strong>学无止境</strong>。就算是你有了10年以上的程序员经历，你也得要使劲地学习，因为你在计算机这个充满一创造力的
领域，每天都会有很多很多的新事物出现。你需要跟上时代的步伐。你需要去了解新的程序语言，以及了解正在发展中的程序语言，以及一些编程框架。还需要去阅
读一些业内的新闻，并到一些热门的社区去参与在线的讨论，这样你才能明白和了解整个软件开发的趋势。在国内，一些著名的社区例
如：CSDN，ITPUB，CHINAUINX等等，在国外，建议你经常上一上digg.com去看看各种BLOG的聚合。</p>
<p>&nbsp;</p>
<p>2. <strong>掌握多种语言</strong>。程序语言总是有其最适合的领域。当你面对需要解决的问题时，你需要找到一个最适合的语言来
解决这些问题。比如，如果你需要性能，可能C/C++是首选，如果你需要跨平台，可能Java是首选，如果你要写一个Web上的开发程序，那么
PHP，ASP，Ajax，JSP可能会是你的选择，如果你要处理一些文本并和别的应用交互，可能Perl,
Python会是最好的。所以，花一些时间去探索一下其它你并熟悉的程序语言，能让你的眼界变宽，因为你被武装得更好，你思考问题也就更为全面，这对于自
己和项目都会有好的帮助。</p>
<p>3. <strong>理性面对不同的操作系统或技术</strong>。程序员们总是有自己心目中无可比拟的技术和操作系统，有的人喜欢Ubuntu，有的人喜欢Debian，还有的人喜欢Windows，以及FreeBSD，MacOSX或Solaris等等。看看我的BLOG(<a href="http://blog.csdn.net/haoel">http://blog.csdn.net/haoel</a>)中的那篇《<a href="http://blog.csdn.net/haoel/archive/2007/03/19/1533720.aspx" target="_blank">其实Unix很简单</a>》
后的回复你就知道程序员们在维护起自己的忠爱时的那份执着了。只有一部分优秀的程序员明白不同操作系统的优势和长处和短处，这样，在系统选型的时候，才能
做到真正的客观和公正，而不会让情绪影响到自己。同样，语言也是一样，有太多的程序员总是喜欢纠缠于语言的对比，如：Java和Perl。哪个刚刚出道的
程序员没有争论去类似的话题呢？比如VC++和Delphi等等。争论这些东西只能表明自己的肤浅和浮燥。优秀的程序并不会执着于这些，而是能够理性的分
析和理心地面对，从而才能客观地做出正确的选择。</p>
<p>4. <strong>别把自己框在单一的开发环境中。</strong>
再一次，正如上面所述，每个程序员都有自己忠爱的工具和技术，有的喜欢老的（比如我就喜欢Vi编辑程序），而有的喜欢新的比如gedit或是Emacs
等。有的喜欢使用像VC++一样的调试器，而我更喜欢GDB命令行方面的调式器。等等等等。程序员在使用什么样的工具上的争论还少吗？到处都是啊。使用什
么样的工具本来无所谓，只要你能更好更快地达到你的目的。但是有一点是优秀程序员都应该了解的——那就是应该去尝试一下别的工作环境。没有比较，你永远不
知道谁好谁不好，你也永远不知道你所不知道的。</p>
<p>5. <strong>使用版本管理工具管理你的代码。</strong>千万不要告诉我你不知道源码的版本管理，如果你的团队开发的源代码并没有
版本管理系统，那么我要告诉你，你的软件开发还处于石器时代。赶快使用一个版式本管理工具吧。CVS
是一个看上去平淡无奇的版本工具，但它是被使用最广的版本管理系统，Subversion 是CVS的一个升级版，其正在开始接管CVS的领地。Git
又是一个不同的版本管理工具。还有Visual
SourceSafe等。使用什么样的版本管理工具依赖于你的团队的大小和地理分布，你也许正在使用最有效率或最没有效率的工具来管理你的源代码。但一个
优秀的程序员总是会使用一款源码版本管理工具来管理自己的代码。如果你要我推荐一个，我推荐你使用开源的Subversion。</p>
<p>6. <strong>是一个优秀的团队成员。</strong>
除非你喜欢独奏，除非你是孤胆英雄。但我想告诉你，今天，可能没有一个成熟的软件是你一个人能做的到的，你可能是你团队中最牛的大拿，但这并不意味着你就
是好的团队成员。你的能力只有放到一个团队中才能施展开来。你在和你的团队成员交流中有礼貌吗？你是否经常和他们沟通，并且大家都喜欢和你在一起讨论问
题？想一想一个足球队吧，你是这个队中好的成员吗？当别人看到你在场上的跑动，当别人看到你的传球和接球和抢断，能受到鼓舞吗？</p>
<p>7. <strong>把你的工作变成文档。</strong>
这一条目当然包括了在代码中写注释，但那还仅仅不够，你还需要做得更多。有良好的注释风格的代码是一个文档的基础，他能够让你和你的团队容易的明白你的意
图和想法。写下文档，并不仅仅是怕我们忘了当时的想法，而且还是一种团队的离线交流的方法，更是一种知识传递的方法。记录下你所知道的一切会是一个好的习
惯。因为，我相信你不希望别人总是在你最忙的时候来打断你问问题，或是你在休假的时候接到公司的电话来询问你问题。而你自己如果老是守着自己的东西，其结
果只可能是让你自己长时间地深陷在这块东西内，而你就更本不可以去做更多的事情。包括向上的晋升。你可能以为&#8220;教会徒弟能饿死师父&#8221;，但我告诉你，你的保
守会让你失去更多更好的东西，请你相信我，我绝不是在这里耸人听闻。</p>
<p>8. <strong>注意备份和安全。</strong>
可能你觉得这是一个&#8220;废话&#8221;，你已明白了备份的重要性。但是，我还是要在这里提出，丢失东西是我们人生中的一部份，你总是会丢东西，这点你永远无法避免。
比如：你的笔记本电脑被人偷了，你的硬盘损坏了，你的电脑中病毒了，你的系统被人入侵了，甚至整个大楼被烧了，等等，等等。所以，做好备份工作是非常非常
重要的事情，硬盘是不可信的，所以定期的刻录光盘或是磁带可能会是一个好的方法，网络也是不可信的，所以小心病毒和黑客，不但使用软件方面的安全策略，你
更需要一个健全的管理制度。此外，尽量的让你的数据放在不同的地方，并做好定期（每日，每周，每月）的备份策略。</p>
<p>9. <strong>设计要足够灵活。</strong>
可能你的需求只会要求你实现一个死的东西，但是，你作为一个优秀的程序，你应该随时在思考这个死的东西是否可以有灵活的一面，比如把一些参数变成可以配置
的，把一些公用的东西形成你的函数库以便以后重用，是否提供插件方面的功能？你的模块是否要以像积木一样随意组合？如果要有修改的话，你的设计是否能够马
上应付？当然，灵活的设计可能并不是要你去重新发明轮子，你应该尽可能是使用标准化的东西。所谓灵话的设计就是要让让考虑更多需求之外的东西，把需求中这
一类的问题都考虑到，而不是只处理需求中所说的那一特定的东西。比如说，需要需要的屏幕分辨率是800&#215;600，那么你的设计能否灵活于其他的分辨率？程
序设计总是需要我们去处理不同的环境，以及未来的趋势。我们需要用动态的眼光去思考问题，而不是刻舟求剑。也许有一天，你今天写的程序就要移植到别的环境
中去，那个时候你就能真正明白什么是灵活的设计了。</p>
<p>10. <strong>不要搬起石头砸自己的脚。</strong>程序员总是有一种不好的习惯，那就是总是想赶快地完成自己手上的工作。但情况
却往往事已愿违。越是想做得快，就越是容易出问题，越是想做得快，就越是容易遗漏问题，最终，程序改过来改过去，按下葫芦起了瓢，最后花费的时间和精力反
而更多。欲速而不达。优秀程序员的习惯是前面多花一些时间多作一些调查，试验一下不网的解决方案，如果时间允许，一个好的习惯是，每4个小时的编程，需要
一个小时的休息，然后又是4个小时的编码。当然，这因人而异，但其目的就是让你时常回头看看，让你想一想这样三个问题：1）是否这么做是对的？2）是否这
么做考虑到了所有的情况？3）是否有更好的方法？想好了再说，时常回头看看走过的路，时常总结一下过去事，会对你有很大的帮助。</p>
<p>以上是十条优秀程序员的习惯或行为规范，希望其可以对你有所帮助。</p>
<p>本文来源于网上phil的BLOG，但我在写作过程中使用了自己的语言和方法重新描述了一下这十条，所以，我希望你在转载的时候能够注明作者和出处以表示对我的尊重。谢谢！</p>
<img src ="http://www.blogjava.net/dashi99/aggbug/261442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2009-03-23 09:59 <a href="http://www.blogjava.net/dashi99/archive/2009/03/23/261442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面试技巧:16个经典面试问题回答思路（转）</title><link>http://www.blogjava.net/dashi99/archive/2009/03/10/258762.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 10 Mar 2009 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2009/03/10/258762.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/258762.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2009/03/10/258762.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/258762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/258762.html</trackback:ping><description><![CDATA[面试过程中，面试官会向应聘者发问，而应聘者的回答将成为面试官考虑是否接受他的重要依据。对应聘者而言，了解这些问题背后的&#8220;猫腻&#8221;至关重要。本文对面试中经常出现的一些典型问题进行了整理，并给出相应的回答思路和参考答案。读者无需过分关注分析的细节，关键是要从这些分析中&#8220;悟&#8221;出面试的规律及回答问题的思维方式，达到&#8220;活学活用&#8221;。 <br />
<br />
　　问题一：&#8220;请你自我介绍一下&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、这是面试的必考题目。 <br />
<br />
　　2、介绍内容要与个人简历相一致。 <br />
<br />
　　3、表述方式上尽量口语化。 <br />
<br />
　　4、要切中要害，不谈无关、无用的内容。 <br />
<br />
　　5、条理要清晰，层次要分明。 <br />
<br />
　　6、事先最好以文字的形式写好背熟。 <br />
<br />
　　问题二：&#8220;谈谈你的家庭情况&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 况对于了解应聘者的性格、观念、心态等有一定的作用，这是招聘单位问该问题的主要原因。 <br />
<br />
　　2、 简单地罗列家庭人口。 <br />
<br />
　　3、 宜强调温馨和睦的家庭氛围。 <br />
<br />
　　4、 宜强调父母对自己教育的重视。 <br />
<br />
　　5、 宜强调各位家庭成员的良好状况。 <br />
<br />
　　6、 宜强调家庭成员对自己工作的支持。 <br />
<br />
　　7、 宜强调自己对家庭的责任感。 <br />
<br />
　　问题三：&#8220;你有什么业余爱好?&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 业余爱好能在一定程度上反映应聘者的性格、观念、心态，这是招聘单位问该问题的主要原因。 <br />
<br />
　　2、 最好不要说自己没有业余爱好。 <br />
<br />
　　3、 不要说自己有那些庸俗的、令人感觉不好的爱好。 <br />
<br />
　　4、 最好不要说自己仅限于读书、听音乐、上网，否则可能令面试官怀疑应聘者性格孤僻。 <br />
<br />
　　5、 最好能有一些户外的业余爱好来&#8220;点缀&#8221;你的形象。 <br />
<br />
　　问题四：&#8220;你最崇拜谁?&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 最崇拜的人能在一定程度上反映应聘者的性格、观念、心态，这是面试官问该问题的主要原因。 <br />
<br />
　　2、 不宜说自己谁都不崇拜。 <br />
<br />
　　3、 不宜说崇拜自己。 <br />
<br />
　　4、 不宜说崇拜一个虚幻的、或是不知名的人。 <br />
<br />
　　5、 不宜说崇拜一个明显具有负面形象的人。 <br />
<br />
　　6、 所崇拜的人人最好与自己所应聘的工作能&#8220;搭&#8221;上关系。 <br />
<br />
　　7、 最好说出自己所崇拜的人的哪些品质、哪些思想感染着自己、鼓舞着自己问题五：&#8220;你的座右铭是什么?&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、座右铭能在一定程度上反映应聘者的性格、观念、心态，这是面试官问这个问题的主要原因。 <br />
<br />
　　2、不宜说那些医引起不好联想的座右铭。 <br />
<br />
　　3、不宜说那些太抽象的座右铭。 <br />
<br />
　　4、不宜说太长的座右铭。 <br />
<br />
　　5、座右铭最好能反映出自己某种优秀品质。 <br />
<br />
　　6、 参考答案——&#8220;只为成功找方法，不为失败找借口&#8221; <br />
<br />
　　问题六：&#8220;谈谈你的缺点&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 不宜说自己没缺点。 <br />
<br />
　　2、 不宜把那些明显的优点说成缺点。 <br />
<br />
　　3、 不宜说出严重影响所应聘工作的缺点。 <br />
<br />
　　4、 不宜说出令人不放心、不舒服的缺点。 <br />
<br />
　　5、 可以说出一些对于所应聘工作&#8220;无关紧要&#8221;的缺点，甚至是一些表面上看是缺点，从工作的角度看却是优点的缺点。 <br />
<br />
　　问题七：&#8220;谈一谈你的一次失败经历&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 不宜说自己没有失败的经历。 <br />
<br />
　　2、 不宜把那些明显的成功说成是失败。 <br />
<br />
　　3、 不宜说出严重影响所应聘工作的失败经历， <br />
<br />
　　4、 所谈经历的结果应是失败的。 <br />
<br />
　　5、 宜说明失败之前自己曾信心白倍、尽心尽力。 <br />
<br />
　　6、 说明仅仅是由于外在客观原因导致失败。 <br />
<br />
　　7、 失败后自己很快振作起来，以更加饱满的热情面对以后的工作。 <br />
<br />
　　问题八：&#8220;你为什么选择我们公司?&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 面试官试图从中了解你求职的动机、愿望以及对此项工作的态度。 <br />
<br />
　　2、 建议从行业、企业和岗位这三个角度来回答。 <br />
<br />
　　3、 参考答案——&#8220;我十分看好贵公司所在的行业，我认为贵公司十分重视人才，而且这项工作很适合我，相信自己一定能做好。&#8221; <br />
<br />
　　问题九：&#8220;对这项工作，你有哪些可预见的困难?&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 不宜直接说出具体的困难，否则可能令对方怀疑应聘者不行。 <br />
<br />
　　2、 可以尝试迂回战术，说出应聘者对困难所持有的态度——&#8220;工作中出现一些困难是正常的，也是难免的，但是只要有坚忍不拔的毅力、良好的合作精神以及事前周密而充分的准备，任何困难都是可以克服的。&#8221; <br />
　问题十：&#8220;如果我录用你，你将怎样开展工作&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 如果应聘者对于应聘的职位缺乏足够的了解，最好不要直接说出自己开展工作的具体办法， <br />
<br />
　　2、 可以尝试采用迂回战术来回答，如&#8220;首先听取领导的指示和要求，然后就有关情况进行了解和熟悉，接下来制定一份近期的工作计划并报领导批准，最后根据计划开展工作。&#8221; <br />
<br />
　　问题十一：&#8220;与上级意见不一是，你将怎么办?&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 一般可以这样回答&#8220;我会给上级以必要的解释和提醒，在这种情况下，我会服从上级的意见。&#8221; <br />
<br />
　　2、 如果面试你的是总经理，而你所应聘的职位另有一位经理，且这位经理当时不在场，可以这样回答：&#8220;对于非原则性问题，我会服从上级的意见，对于涉及公司利益的重大问题，我希望能向更高层领导反映。&#8221; <br />
<br />
　　问题十二：&#8220;我们为什么要录用你?&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 应聘者最好站在招聘单位的角度来回答。 <br />
<br />
　　2、 招聘单位一般会录用这样的应聘者：基本符合条件、对这份共组感兴趣、有足够的信心。 <br />
<br />
　　3、 如&#8220;我符合贵公司的招聘条件，凭我目前掌握的技能、高度的责任感和良好的饿适应能力及学习能力，完全能胜任这份工作。我十分希望能为贵 公司服务，如果贵公司给我这个机会，我一定能成为贵公司的栋梁!&#8221; <br />
<br />
　　问题十三：&#8220;你能为我们做什么?&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 基本原则上&#8220;投其所好&#8221;。 <br />
<br />
　　2、 回答这个问题前应聘者最好能&#8220;先发制人&#8221;，了解招聘单位期待这个职位所能发挥的作用。 <br />
<br />
　　3、 应聘者可以根据自己的了解，结合自己在专业领域的优势来回答这个问题。 <br />
<br />
　　问题十四：&#8220;你是应届毕业生，缺乏经验，如何能胜任这项工作?&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 如果招聘单位对应届毕业生的应聘者提出这个问题，说明招聘单位并不真正在乎&#8220;经验&#8221;，关键看应聘者怎样回答。 <br />
<br />
　　2、 对这个问题的回答最好要体现出应聘者的诚恳、机智、果敢及敬业。 <br />
<br />
　　3、 如&#8220;作为应届毕业生，在工作经验方面的确会有所欠缺，因此在读书期间我一直利用各种机会在这个行业里做兼职。我也发现，实际工作远比书本知识丰富、复杂。但我有较强的责任心、适应能力和学习能力，而且比较勤奋，所以在兼职中均能圆满完成各项工作，从中获取的经验也令我受益非浅。请贵公司放心，学校所学及兼职的工作经验使我一定能胜任这个职位。&#8221; <br />
<br />
　　问题十五：&#8220;你希望与什么样的上级共事?&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 通过应聘者对上级的&#8220;希望&#8221;可以判断出应聘者对自我要求的意识，这既上一个陷阱，又上一次机会。 <br />
<br />
　　2、 最好回避对上级具体的希望，多谈对自己的要求。 <br />
<br />
　　3、 如&#8220;做为刚步入社会新人，我应该多要求自己尽快熟悉环境、适应环境，而不应该对环境提出什么要求，只要能发挥我的专长就可以了。&#8221; <br />
<br />
　　问题十六：&#8220;您在前一家公司的离职原因是什么?&#8221; <br />
<br />
　　思路： <br />
<br />
　　1、 最重要的是：应聘者要使找招聘单位相信，应聘者在过往的单位的&#8220;离职原因&#8221;在此家招聘单位里不存在。 2、 避免把&#8220;离职原因&#8221;说得太详细、太具体。 <br />
<br />
　　3、 不能掺杂主观的负面感受，如&#8220;太幸苦&#8221;、&#8220;人际关系复杂&#8221;、&#8220;管理太混乱&#8221;、&#8220;公司不重视人才&#8221;、&#8220;公司排斥我们某某的员工&#8221;等。 <br />
<br />
　　4、 但也不能躲闪、回避，如&#8220;想换换环境&#8221;、&#8220;个人原因&#8221;等。 <br />
<br />
　　5、 不能涉及自己负面的人格特征，如不诚实、懒惰、缺乏责任感、不随和等。 <br />
<br />
　　6、 尽量使解释的理由为应聘者个人形象添彩。 <br />
<br />
　　7、 如&#8220;我离职是因为这家公司倒闭。我在公司工作了三年多，有较深的感情。从去年始，由于市场形势突变，公司的局面急转直下。到眼下这一步我觉得很遗憾，但还要面对显示，重新寻找能发挥我能力的舞台。&#8221; 同一个面试问题并非只有一个答案，而同一个答案并不是在任何面试场合都有效，关键在于应聘者掌握了规律后，对面试的具体情况进行把握，有意识地揣摩面试官提出问题的心理背景，然后投其所好 <br />
<img src ="http://www.blogjava.net/dashi99/aggbug/258762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2009-03-10 11:48 <a href="http://www.blogjava.net/dashi99/archive/2009/03/10/258762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java应用基础：网友精选25个Java试题分享</title><link>http://www.blogjava.net/dashi99/archive/2009/03/04/257759.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Wed, 04 Mar 2009 04:27:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2009/03/04/257759.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/257759.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2009/03/04/257759.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/257759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/257759.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1. float型float f=3.4是否正确? 　答：不正确，应为float f=3.4f 2. 当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递? 　答：是引用传递。 3. 在java中一个类被声明为final类型，表示了什么意思? 　答：表示该类不能被继承，意味着它不能再派生出新的子类，不能作为父类...&nbsp;&nbsp;<a href='http://www.blogjava.net/dashi99/archive/2009/03/04/257759.html'>阅读全文</a><img src ="http://www.blogjava.net/dashi99/aggbug/257759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2009-03-04 12:27 <a href="http://www.blogjava.net/dashi99/archive/2009/03/04/257759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Comparator和Comparable比较</title><link>http://www.blogjava.net/dashi99/archive/2009/02/19/255530.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Thu, 19 Feb 2009 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2009/02/19/255530.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/255530.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2009/02/19/255530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/255530.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/255530.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 当需要排序的集合或数组不是单纯的数字型时，通常可以使用Comparator或Comparable，以简单的方式实现对象排序或自定义排序。一、Comparator强行对某个对象collection进行整体排序的比较函数，可以将Comparator传递给Collections.sort或Arrays.sort。接口方法：1&nbsp;&nbsp;/**&nbsp;*//**2&...&nbsp;&nbsp;<a href='http://www.blogjava.net/dashi99/archive/2009/02/19/255530.html'>阅读全文</a><img src ="http://www.blogjava.net/dashi99/aggbug/255530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2009-02-19 15:36 <a href="http://www.blogjava.net/dashi99/archive/2009/02/19/255530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP/1.1 Cache-Control的理解</title><link>http://www.blogjava.net/dashi99/archive/2008/12/30/249207.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 30 Dec 2008 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2008/12/30/249207.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/249207.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2008/12/30/249207.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/249207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/249207.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网页的缓存是由HTTP消息头中的&#8220;Cache-control&#8221;来控制的，常见的取值有private、no-cache、max-age、must-revalidate等，默认为private。其作用根据不同的重新浏览方式分为以下几种情况：<br />
<strong>（1） 打开新窗口</strong><br />
如果指定cache-control的值为private、no-cache、must-revalidate，那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值，那么在此值内的时间里就不会重新访问服务器，例如：<br />
<font face="Verdana, Geneva, Arial, Sans-serif" color="#000080">Cache-control: max-age=5</font><br />
表示当访问此网页后的5秒内再次访问不会去服务器<br />
<strong>（2） 在地址栏回车</strong><br />
如果值为private或must-revalidate（和网上说的不一样），则只有第一次访问时会访问服务器，以后就不再访问。如果值为no-cache，那么每次都会访问。如果值为max-age，则在过期之前不会重复访问。<br />
<strong>（3） 按后退按扭</strong><br />
如果值为private、must-revalidate、max-age，则不会重访问，而如果为no-cache，则每次都重复访问<br />
<strong>（4） 按刷新按扭<br />
</strong>无论为何值，都会重复访问 <br />
<img height="366" alt="" src="http://www.blogjava.net/images/blogjava_net/dashi99/a.jpg" width="515" border="0" /><br />
<br />
项目中使用过滤器来设置网页的缓存<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">FilterConfig&nbsp;fc;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doFilter(ServletRequest&nbsp;req,&nbsp;ServletResponse&nbsp;res,<br />
<img id="Codehighlighter1_153_583_Open_Image" onclick="this.style.display='none'; Codehighlighter1_153_583_Open_Text.style.display='none'; Codehighlighter1_153_583_Closed_Image.style.display='inline'; Codehighlighter1_153_583_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_153_583_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_153_583_Closed_Text.style.display='none'; Codehighlighter1_153_583_Open_Image.style.display='inline'; Codehighlighter1_153_583_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterChain&nbsp;chain)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,&nbsp;ServletException&nbsp;</span><span id="Codehighlighter1_153_583_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_153_583_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(HttpServletResponse)&nbsp;res;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;set&nbsp;the&nbsp;provided&nbsp;HTTP&nbsp;response&nbsp;parameters</span><span style="color: #008000"><br />
<img id="Codehighlighter1_353_498_Open_Image" onclick="this.style.display='none'; Codehighlighter1_353_498_Open_Text.style.display='none'; Codehighlighter1_353_498_Closed_Image.style.display='inline'; Codehighlighter1_353_498_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_353_498_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_353_498_Closed_Text.style.display='none'; Codehighlighter1_353_498_Open_Image.style.display='inline'; Codehighlighter1_353_498_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Enumeration&nbsp;e&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fc.getInitParameterNames();&nbsp;e.hasMoreElements();)&nbsp;</span><span id="Codehighlighter1_353_498_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_353_498_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;headerName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;e.nextElement();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.addHeader(headerName,&nbsp;fc.getInitParameter(headerName));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;pass&nbsp;the&nbsp;request/response&nbsp;on</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chain.doFilter(req,&nbsp;response);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span></div>
<br />
配置文件的配置：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">NoCache</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">filter.CacheFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Cache-Control</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">no-cache,&nbsp;must-revalidate</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">CacheForWeek</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">filter.CacheFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Cache-Control</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">max-age=604800</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">CacheForWeek</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*.js</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">CacheForWeek</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*.css</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">CacheForWeek</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*.gif</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<br />
上述设置保存了1周的缓存。<br />
  <img src ="http://www.blogjava.net/dashi99/aggbug/249207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dashi99/" target="_blank">ゞ沉默是金ゞ</a> 2008-12-30 16:49 <a href="http://www.blogjava.net/dashi99/archive/2008/12/30/249207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>