﻿<?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-ゞ沉默是金ゞ</title><link>http://www.blogjava.net/dashi99/</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>Wed, 29 Apr 2026 01:30:41 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 01:30:41 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>How To Avoid javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated Problem Using Apache HttpClient</title><link>http://www.blogjava.net/dashi99/archive/2012/08/14/385484.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 14 Aug 2012 10:42:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/14/385484.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/385484.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/14/385484.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/385484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/385484.html</trackback:ping><description><![CDATA[<div>
<p>I use Apache&#8217;s <strong><span style="color: #0000ff;">HttpClient</span></strong> library for all my URL related needs. It is a marvelous library that does most of the job behind the scenes. Compared the Java&#8217;s <strong><span style="color: #0000ff;">URL</span></strong> class, it is not as easy to use as Apache&#8217;s <strong><span style="color: #0000ff;">HttpClient</span></strong>. While using this library, a site that I commonly check for updates threw the exception message <strong><span style="color: #0000ff;">javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated</span></strong>.</p>
<p>When I checked the site, it seemed that its SSL certificated had expired. The only workaround for this is to create your own <strong><span style="color: #0000ff;">TrustManager</span></strong>. This class actually checks if the SSL certificate is valid. The scheme used by SSL is called X.509 and Java has a specific <strong><span style="color: #0000ff;">TrustManager</span></strong> for this scheme, called <strong><span style="color: #0000ff;">X509TrustManager</span></strong>.</p>
<p>This handy method created by theskeleton is just the perfect solution to have your <strong><span style="color: #0000ff;">HttpClient</span></strong> object bypass any SSL related errors and ensures that it accepts all SSL certificates of a site, whether it is expired or not.</p>
</div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;HttpClient&nbsp;wrapClient(HttpClient&nbsp;base)&nbsp;{<br />
&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;SSLContext&nbsp;ctx&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SSLContext.getInstance(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">TLS</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X509TrustManager&nbsp;tm&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;X509TrustManager()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;checkClientTrusted(X509Certificate[]&nbsp;xcs,&nbsp;String&nbsp;string)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;CertificateException&nbsp;{&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;checkServerTrusted(X509Certificate[]&nbsp;xcs,&nbsp;String&nbsp;string)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;CertificateException&nbsp;{&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;X509Certificate[]&nbsp;getAcceptedIssuers()&nbsp;{<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;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.init(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;TrustManager[]{tm},&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSLSocketFactory&nbsp;ssf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;SSLSocketFactory(ctx);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClientConnectionManager&nbsp;ccm&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;base.getConnectionManager();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SchemeRegistry&nbsp;sr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ccm.getSchemeRegistry();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sr.register(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Scheme(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">https</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;ssf,&nbsp;</span><span style="color: #000000; ">443</span><span style="color: #000000; ">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;DefaultHttpClient(ccm,&nbsp;base.getParams());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;ex)&nbsp;{<br />
&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;}<br />
}<br />
<br />
Another way is to recreate the keystore, for the keystore you should have the site in the CN=XXX.<br />the command as below:<br />1. Create keystore<br /><div>keytool -genkey -dname "cn=daXXX.XXX.com,o=,c=" -storepass MB7BROKERpzn -keystore pznKeyStore.jks -alias pznsigned</div><div>2. Export the cert<br />keytool -export -keystore pznKeyStore.jks -alias pznsigned -file pznsslcert.cer<br />3. Create trust store for client<br />keytool -genkey -dname "cn=da957203.fmr.com,o=,c=" -storepass MB7BROKERpzn -keystore pznTrustStore.jks -alias pzntrustsigned<br />4. import the server cert<br />keytool -import -alias pzntrust -file pznsslcert.cer -keystore pznTrustStore.jks -storepass MB7BROKERpzn<br />5. use http client to call the server<br /><div>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;KeyStore trustStore&nbsp; = KeyStore.getInstance(KeyStore.getDefaultType());<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;FileInputStream instream = new FileInputStream(new File(trustfname));<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; trustStore.load(instream, passphrase.toCharArray());<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} finally {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; try { instream.close(); } catch (Exception ignore) {}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Scheme sch = new Scheme("https", 443, socketFactory);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;httpclient.getConnectionManager().getSchemeRegistry().register(sch);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (Exception e1) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// TODO Auto-generated catch block<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e1.printStackTrace();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}</div></div><br /><br />
<br />
<br />
<br />
</span></div><img src ="http://www.blogjava.net/dashi99/aggbug/385484.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-14 18:42 <a href="http://www.blogjava.net/dashi99/archive/2012/08/14/385484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to insert multiple record into DB with store procedure?</title><link>http://www.blogjava.net/dashi99/archive/2012/08/13/385403.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Mon, 13 Aug 2012 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/13/385403.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/385403.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/13/385403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/385403.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/385403.html</trackback:ping><description><![CDATA[<div>  <p style="text-indent:-.25in;"><strong><span style="color:#1F497D">1.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="color:#1F497D">1.Define the object type PROFILE_TAG_TYPE.</span></strong></p>  <p style="margin-left:.25in"><span style="color:#1F497D">CREATE OR REPLACE TYPE PZN_ADMIN.PROFILE_TAG_TYPE</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">AS</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;OBJECT</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;(</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; MID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2 (34),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; TAG_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; CUSTOMER_TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(1),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; SOURCE_SYSTEM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(30),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; TAG_CREATED_DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(30),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; INTEREST_LEVEL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(2),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; SUPPRESSION_IND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(2),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; SUPPRESSION_EXPIRY_DATE VARCHAR2(30),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; LAST_HOUSEKEEPING_DATE&nbsp;VARCHAR2(30),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; LAST_EVENT_DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(30),</span></p>  <p style="margin-left:.25in;text-indent:9.0pt"><span style="color:#1F497D">REASON<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>VARCHAR2(1500) );</span></p>  <p style="margin-left:.25in;text-indent:9.0pt">&nbsp;</p>  <p style="text-indent:-.25in;"><strong><span style="color:#1F497D">2.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="color:#1F497D">2. Grant PROFILE_TAG_TYPE&nbsp;execute access to PZN_MB_USER.</span></strong></p>  <p style="margin-left:.25in"><span style="color:#1F497D">GRANT EXECUTE ON PZN_ADMIN.PROFILE_TAG_TYPE TO PZN_MB_USER;</span></p>  <p style="margin-left:.25in">&nbsp;</p>  <p style="text-indent:-.25in;"><strong><span style="color:#1F497D">3.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="color:#1F497D">3. Define the array type reference to object PROFILE_TAG_TYPE.</span></strong></p>  <p style="margin-left:.25in"><span style="color:#1F497D">CREATE TYPE PZN_ADMIN.PROFILE_TAG_ARRAY AS TABLE OF PZN_ADMIN.PROFILE_TAG_TYPE; </span></p>  <p style="margin-left:.25in">&nbsp;</p>  <p style="text-indent:-.25in;"><strong><span style="color:#1F497D">4.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color:#1F497D"><span style="font: 12pt &quot;Times New Roman&quot;;">4. </span></span></strong><strong><span style="color:#1F497D">Grant PROFILE_TAG_ARRAY execute access to PZN_MB_USER.</span></strong></p>  <p style="margin-left:.25in"><span style="color:#1F497D">GRANT EXECUTE ON PZN_ADMIN.PROFILE_TAG_ARRAY TO PZN_MB_USER;</span></p>  <p style="margin-left:.25in">&nbsp;</p>  <p style="text-indent:-.25in;"><strong><span style="color:#1F497D">5.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="color:#1F497D">5. Create store procedure package.</span></strong></p>  <p style="margin-left:.25in"><span style="color:#1F497D">CREATE OR REPLACE</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">PACKAGE PZN_ADMIN.PZN_PROFILE_TAG_PKG</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">AS</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">PROCEDURE INSERT_PROFILE_TAG(</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; PTA PROFILE_TAG_ARRAY);</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">END PZN_PROFILE_TAG_PKG;</span></p>  <p style="margin-left:.25in">&nbsp;</p>  <p style="text-indent:-.25in;"><strong><span style="color:#1F497D">6.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="color:#1F497D">6. Create store procedure package body.</span></strong></p>  <p style="margin-left:.25in"><span style="color:#1F497D">CREATE OR REPLACE</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">PACKAGE BODY PZN_ADMIN.PZN_PROFILE_TAG_PKG</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">AS</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">PROCEDURE INSERT_PROFILE_TAG(</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; PTA PROFILE_TAG_ARRAY)</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">AS</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">BEGIN</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;FOR I IN PTA.FIRST..PTA.LAST</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;LOOP</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; INSERT</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; INTO PZN_ADMIN.PROFILE_TAG</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PROFILE_TAG_ID,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MID,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TAG_ID,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CUSTOMER_TYPE,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOURCE_SYSTEM,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TAG_CREATED_DATE,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTEREST_LEVEL,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUPPRESSION_IND,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUPPRESSION_EXPIRY_DATE,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LAST_HOUSEKEEPING_DATE,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LAST_EVENT_DATE,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REASON</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEQ_PROFILE_TAG_ID.NEXTVAL ,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTA(I).MID,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTA(I).TAG_ID,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTA(I).CUSTOMER_TYPE,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTA(I).SOURCE_SYSTEM,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TO_DATE(PTA(I).TAG_CREATED_DATE,'YYYY-MM-DD'),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTA(I).INTEREST_LEVEL,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTA(I).SUPPRESSION_IND,</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TO_DATE(PTA(I).SUPPRESSION_EXPIRY_DATE,'YYYY-MM-DD'),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TO_DATE(PTA(I).LAST_HOUSEKEEPING_DATE,'YYYY-MM-DD'),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TO_DATE(PTA(I).LAST_EVENT_DATE,'YYYY-MM-DD'),</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTA(I).REASON</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;END LOOP;</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">END INSERT_PROFILE_TAG;</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">END PZN_PROFILE_TAG_PKG;</span></p>  <p style="margin-left:.25in">&nbsp;</p>  <p style="text-indent:-.25in;"><strong><span style="color:#1F497D">7.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="color:#1F497D">7. Create synonym to PZN_MB_USER.</span></strong></p>  <p style="margin-left:.25in"><span style="color:#1F497D">CREATE SYNONYM PZN_MB_USER.PZN_PROFILE_TAG_PKG FOR PZN_ADMIN.PZN_PROFILE_TAG_PKG;</span></p>  <p style="margin-left:.25in">&nbsp;</p>  <p style="text-indent:-.25in;"><strong><span style="color:#1F497D">8.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="color:#1F497D">8. Grant execute access to PZN_MB_USER.</span></strong></p>  <p style="margin-left:.25in"><span style="color:#1F497D">GRANT EXECUTE ON PZN_ADMIN.PZN_PROFILE_TAG_PKG TO PZN_MB_USER;</span></p>  <p style="margin-left:.25in">&nbsp;</p>  <p style="text-indent:-.25in;"><strong><span style="color:#1F497D">9.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="color:#1F497D">9. Create the java class to call the procedure.</span></strong></p>  <p style="margin-left:.25in">&nbsp;</p>  <p style="margin-left:.25in"><span style="color:#1F497D">public class ProcedureTest2 {</span></p>  <p style="margin-left:.25in">&nbsp;</p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void insertProfileTag(){</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection dbConn = null;</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] so1 = {"ee745b5782bfc311e0b5730a2aba15aa77",31,"C","eDB","2012-08-13",0,"0","2012-08-13","2012-08-13","2012-08-13","eDB"};</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] so2 = {"ee745b5782bfc311e0b5730a2aba15aa77",32,"C","eDB","2012-08-13",0,"0","2012-08-13","2012-08-13","2012-08-13","eDB"};</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OracleCallableStatement callStatement = null;</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("oracle.jdbc.driver.OracleDriver");</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbConn = DriverManager.getConnection("jdbc:oracle:thin:@da957116.fmr.com:1521:orcl", "PZN_MB_USER", "PZN_MB_USER123");</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StructDescriptor st = new StructDescriptor("PZN_ADMIN.PROFILE_TAG_TYPE", dbConn);</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STRUCT s1 = new STRUCT(st, dbConn, so1);</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STRUCT s2 = new STRUCT(st, dbConn, so2);</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STRUCT[] deptArray = { s1, s2 };</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArrayDescriptor arrayDept = ArrayDescriptor.createDescriptor("PZN_ADMIN.PROFILE_TAG_ARRAY", dbConn);</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARRAY deptArrayObject = new ARRAY(arrayDept, dbConn, deptArray);</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callStatement = (OracleCallableStatement) dbConn.prepareCall("{call PZN_PROFILE_TAG_PKG.INSERT_PROFILE_TAG(?)}");</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callStatement.setArray(1, deptArrayObject);</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callStatement.executeUpdate();</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbConn.commit();</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callStatement.close();</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e.toString());</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p style="margin-left:.25in">&nbsp;</p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertProfileTag();</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p style="margin-left:.25in"><span style="color:#1F497D">}</span></p>  </div><img src ="http://www.blogjava.net/dashi99/aggbug/385403.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-13 16:17 <a href="http://www.blogjava.net/dashi99/archive/2012/08/13/385403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Use LinkedHashMap to write one simple cache</title><link>http://www.blogjava.net/dashi99/archive/2012/08/07/384989.html</link><dc:creator>ゞ沉默是金ゞ</dc:creator><author>ゞ沉默是金ゞ</author><pubDate>Tue, 07 Aug 2012 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/dashi99/archive/2012/08/07/384989.html</guid><wfw:comment>http://www.blogjava.net/dashi99/comments/384989.html</wfw:comment><comments>http://www.blogjava.net/dashi99/archive/2012/08/07/384989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dashi99/comments/commentRss/384989.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dashi99/services/trackbacks/384989.html</trackback:ping><description><![CDATA[<div>The processing costs for selecting a value from a database-table are fairly high compared to the costs having the value already in memory. So it seems preferrable to use some smart caching-mechanism that keeps often used values in your application instead of retrieving these values from resources somewhere &#8216;outside&#8217;.<br /><br />Most frameworks have at least one cache implementation onboard, but there also exist several other implementations of caches like e.g. EHCache. Even ordinary HashMaps/Hashtables can serve as caches also.<br /><br />A critial factor when using caches in Java is the size of the cache: when your cache grows too big, the Java Garbage Collector has to cleanup more often (which consumes time) or your application even crashes with a java.lang.OutOfMemoryError.<br /><br />One way to control the memory-consumption of caches is to use SoftReferences in HashMaps/Hashtables, another one is to throw away old or unused content by implementing a caching-strategy like e.g. LRU.<br /><br />A simple LRU-cache already ships within the components of the Java Standard Library: the LinkedHashMap. All you have to do is to tell your application whether the eldest entry in the map should be retained or removed after a new entry is inserted. Additionally a special constructor has to be used that defines the orderingMode for the map: &#8216;true&#8217; for access-order (LRU), &#8216;false&#8217; for insertion-order.<br /><br />Suppose we want to cache a mapping of String-Names to String-Ids with a maximum size of 20480 entries.<br />How that can be done is shown by the example below with the use of an Anonymous Inner Class that overrides the removeEldestEntry-method of the LinkedHashMap.</div><br /><div>import com.fmr.pzn.wmb.utils.Vaidator;<br /><br />import java.util.Collections;<br />import java.util.LinkedHashMap;<br />import java.util.Map;<br /><br />public final class SampleCache {<br /><br />&nbsp;&nbsp; &nbsp;private static final float LOAD_FACTOR = 0.75f;<br /><br />&nbsp;&nbsp; &nbsp;private static final int CACHE_MAX = 20480;<br /><br />&nbsp;&nbsp; &nbsp;private static final int CACHE_INIT = 10000;<br /><br />&nbsp;&nbsp; &nbsp;private static final LinkedHashMap&lt;String, String&gt; CACHE_MAP = new LinkedHashMap&lt;String, String&gt;(CACHE_INIT,<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;LOAD_FACTOR, true) {<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;private static final long serialVersionUID = 628057782352519437L;<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;@Override<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;protected boolean removeEldestEntry(Entry&lt;String, String&gt; eldest) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return size() &gt; SampleCache.CACHE_MAX;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;};<br /><br /><br />&nbsp;&nbsp; &nbsp;private SampleCache() {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;super();<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;public static void putid(final String id, final String name) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (isEmpty(id) || isEmpty(name)) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;CACHE_MAP.put(id, name);<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;public static String getByid(final String id) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return CACHE_MAP.get(id);<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;public static boolean isEmpty(final String field ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;boolean isEmpty = false;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(field == null || field.isEmpty())<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;isEmpty = true;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return isEmpty;<br />&nbsp;&nbsp; &nbsp;}<br />}</div>And based on the high performance environment, this cache will not thread safe. How to fix this small issue? we can use Collections.synchronizedMap() to synchronized cache. like:<br /><br /><div>&nbsp;&nbsp;&nbsp; private static final Map&lt;String, String&gt; CACHE_MAP = Collections.synchronizedMap(new LinkedHashMap&lt;String, String&gt;(CACHE_INIT,<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;LOAD_FACTOR, true) {<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;private static final long serialVersionUID = 628057782352519437L;<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;@Override<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;protected boolean removeEldestEntry(Entry&lt;String, String&gt; eldest) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return size() &gt; SampleCache.CACHE_MAX;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;});</div><br />Now, there is one small cache exists in your application.<img src ="http://www.blogjava.net/dashi99/aggbug/384989.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-07 16:11 <a href="http://www.blogjava.net/dashi99/archive/2012/08/07/384989.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></channel></rss>