﻿<?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-依然Fantasy-随笔分类-原创</title><link>http://www.blogjava.net/michaelcao/category/37900.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 22 Mar 2009 23:10:21 GMT</lastBuildDate><pubDate>Sun, 22 Mar 2009 23:10:21 GMT</pubDate><ttl>60</ttl><item><title>利用线程池上传大文件(三)</title><link>http://www.blogjava.net/michaelcao/archive/2009/03/21/261173.html</link><dc:creator>依然Fantasy</dc:creator><author>依然Fantasy</author><pubDate>Sat, 21 Mar 2009 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/michaelcao/archive/2009/03/21/261173.html</guid><wfw:comment>http://www.blogjava.net/michaelcao/comments/261173.html</wfw:comment><comments>http://www.blogjava.net/michaelcao/archive/2009/03/21/261173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/michaelcao/comments/commentRss/261173.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/michaelcao/services/trackbacks/261173.html</trackback:ping><description><![CDATA[<p>(文章本人原创，若转载请注明出处)</p>
<p>下面看一下一些具体的实现，先看一下Sender接口的commitData方法的MySql实现，即SenderMySqlImp类：</p>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp; public void commitData(String path, String file) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Connection connect = null;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; try {<br />
</span><span style="color: #000000;"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</strong></span><strong>根据配置由Helper来确定是否用连接池,这只调用getConnection()即可</strong><br />
<span style="color: #000000;"><strong>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp; connect = Helper.getConnection();</strong></span><br />
&nbsp;&nbsp;<span style="color: #000000;"> &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; connect.setAutoCommit(false);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FileInputStream fis = new FileInputStream(path + file);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong>//insert语句,有三个参数分别为id,image,filename字段。</strong><br />
<span style="color: #000000;"><em>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <strong></strong></em><strong>ps = connect.prepareStatement(sql.toString());</strong></span><br />
<span style="color: #000000;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ps.setString(1, UUID.randomUUID().toString());<br />
</span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将图片文件流化,用jdbc直接写到数据库 </strong><br />
<span style="color: #000000;">
<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </strong></span><strong>ps.setBinaryStream(2, fis, fis.available());</strong><br />
<span style="color: #000000;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ps.setString(3, file);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ps.executeUpdate();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; connect.commit();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; count++;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Logger.writeLog("已处理文件数："+count+"，时间："+new java.util.Date());<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ........<br />
&nbsp;&nbsp; &nbsp;}</span></div>
<p>&nbsp;&nbsp;&nbsp; 很简单吧，其实就是用Stream来做，另外在网上可以找到有关Oracle上传blob的实现，一般都是先insert一条记录，blob字段用empty_blob()函数插入一个空数据，然后再取出这个blob字段，最后按字节写入blob，具体参考SenderOracleImp类吧。个人感觉还是在mysql的这个效率高些并且看起来简单了很多。</p>
<p>&nbsp;&nbsp;&nbsp; 然后来看看使用线程池的ProcessMulti类：</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><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;ProcessMulti&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Process{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Vector</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;files&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Vector</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Properties&nbsp;prop;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ProcessMulti()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prop&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ConfigMgr.getProperties();&nbsp; //取config.properties中配置信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;prop.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">path</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.files&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Helper.getFiles(prop.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">filetype</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.path);<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;doProcess()&nbsp;{<br />
<strong>//正如前面两篇所说,这里是线程池构建器,传入相关参数</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BlobSenderThreadPool&nbsp;tpe&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BlobSenderThreadPool(Integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.valueOf(prop.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">corePoolSize</span><span style="color: #000000;">"</span><span style="color: #000000;">)),&nbsp;Integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.valueOf(prop.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">maxPoolSize</span><span style="color: #000000;">"</span><span style="color: #000000;">)),&nbsp;Integer.valueOf(prop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">keepAliveTime</span><span style="color: #000000;">"</span><span style="color: #000000;">)),&nbsp;TimeUnit.SECONDS,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayBlockingQueue</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Runnable</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(Integer.valueOf(prop<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;.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">maxPoolSize</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;">new</span><span style="color: #000000;">&nbsp;BlobSenderThreadPool.DiscardPolicy(),&nbsp;files.size());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.writeLogForce(</span><span style="color: #000000;">"</span><span style="color: #000000;">开始处理<img src="http://www.blogjava.net/Images/dot.gif" alt="" />.</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;java.util.Date());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.files.size();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //向线程池提交要处理的任务,线程池根据其配置进行处理<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Helper.getSender()会根据配置取得支持mysql或是oracel的写入方法</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tpe.execute(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Runner(path,&nbsp;files.get(i),&nbsp;Helper.getSender()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.writeLog(</span><span style="color: #000000;">"</span><span style="color: #000000;">已提交第</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(i</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;&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;">&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;java.util.Date());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<strong>　　　　//可以在这里写一个打印输出,实际上程序很快就执行完上面的for,运行到这里,但是处理并没有完成,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //主程序好像职业经理人,他的工作就是分配任务给下属,自已就完成工作了,但下属们还要接着忙活呵呵...</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("任务已分配...");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp; //线程池类<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BlobSenderThreadPool&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;ThreadPoolExecutor&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">volatile</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;planTask;//计划任务,即计划要写的文件数<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BlobSenderThreadPool(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;corePoolSize,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;maximumPoolSize,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;keepAliveTime,&nbsp;TimeUnit&nbsp;unit,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BlockingQueue</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Runnable</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;workQueue,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RejectedExecutionHandler&nbsp;handler,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;planTask)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(corePoolSize,&nbsp;maximumPoolSize,&nbsp;keepAliveTime,&nbsp;unit,&nbsp;workQueue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.planTask&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;planTask;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>//当某个线程处理完时会调用此方法</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;afterExecute(Runnable&nbsp;r,&nbsp;Throwable&nbsp;t)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.writeLog(</span><span style="color: #000000;">"</span><span style="color: #000000;">当前已完成任务数：</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getCompletedTaskCount()</span><span style="color: #000000;">+</span><span style="color: #000000;">1</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: #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;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;planTask);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //若已处理完任务和计划的任务数相同说明所有线程已完成处理,终止线程池处理<br />
</span><span style="color: #0000ff;">　　　　　　if</span><span style="color: #000000;">&nbsp;((</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getCompletedTaskCount()</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;planTask)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.terminated();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.afterExecute(r,&nbsp;t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;terminated()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.writeLogForce(</span><span style="color: #000000;">"</span><span style="color: #000000;">所有任务已完成&nbsp;,处理结束时间===&gt;&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;java.util.Date());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<strong>//要使用线程进行处理,类要实现Runable接口</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Runner&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Runnable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;file;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sender&nbsp;sender;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runner(String&nbsp;path,&nbsp;String&nbsp;file,&nbsp;Sender&nbsp;sender)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.file&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;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.sender&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sender;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<strong>//Runer的实例会被传入线程池,线程被运行时会调用run方法</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sender.commitData(path,&nbsp;file);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<img src ="http://www.blogjava.net/michaelcao/aggbug/261173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/michaelcao/" target="_blank">依然Fantasy</a> 2009-03-21 10:40 <a href="http://www.blogjava.net/michaelcao/archive/2009/03/21/261173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重回NOKIA怀抱</title><link>http://www.blogjava.net/michaelcao/archive/2008/10/13/234121.html</link><dc:creator>依然Fantasy</dc:creator><author>依然Fantasy</author><pubDate>Mon, 13 Oct 2008 14:59:00 GMT</pubDate><guid>http://www.blogjava.net/michaelcao/archive/2008/10/13/234121.html</guid><wfw:comment>http://www.blogjava.net/michaelcao/comments/234121.html</wfw:comment><comments>http://www.blogjava.net/michaelcao/archive/2008/10/13/234121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/michaelcao/comments/commentRss/234121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/michaelcao/services/trackbacks/234121.html</trackback:ping><description><![CDATA[<p>　　周5手机不幸被盗，可恶的小偷，偷我的手机你就断手断脚吧。明天准备联系索爱和移动客服看是否能通过手机串码把手机屏蔽，据说从技术角度讲是可以行的通的，问题就是这种事手机运营商愿不愿意给做了。<a href="http://news.china.com/zh_cn/news100/11038989/20061004/13664095.html">英国已经有这种服务可以使被盗手机不能再被使用</a>，不知道特色中国啥时能有这种真正特色的服务呢。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我的索爱W810听音乐音质超好，入耳式耳机也很棒，感觉比专业的魅族MP3还高一筹(主要魅族带的耳机太烂,而且魅族音质风格有点假,特别配上自带耳机后听音乐塑料感极强)。w810音质风格基本上就是SONY早年CDWalkMan那种日系风格，加上入耳式耳机低音很强。另外FM收音功能也很不错，信号很好，这个我也是和魅族的MP3对比过的，同样环境下FM收音信号也强一些，相对由于信号弱造成的背景噪音小一些,加上声音渲染修饰的好,不会有由于信号不好造成的刺耳声。W810的拍照功能也不错，拍的照片，特别是白天光线好时，拍出来的照片基本上可以冒充数码相机的了。总之，用了一年，感觉W810最大缺点就是短信有容量限制，我基本上半个月就得清一回收件箱。个人认为w810作为手机来用是比不上NOKIA的好用，但是随身听、拍照功能的确很好，估计索爱的W系列基本也都是这样。哎可惜现在连个尸体都没留下..怀念呀.....</p>
<blockquote>
<p><a href="http://www.blogjava.net/images/blogjava_net/michaelcao/WindowsLiveWriter/NOKIA_1339A/w810_2.jpg"><img style="border: 0px none ;" alt="w810" src="http://www.blogjava.net/images/blogjava_net/michaelcao/WindowsLiveWriter/NOKIA_1339A/w810_thumb.jpg" border="0" height="184" width="244" /></a> </p>
<p>w810</p>
</blockquote>
<p>　　平时忙没时间逛商店，周6到滨江道溜达了一圈，据卖手机的服务员说，天语手机销量已经能和NOKIA有的一拼了，想想一年多前还是名不见经传，世界变化快呀。由于之前在淘宝上看过价格了，所以无论哪款手机门店里的价格基本上没法接受了。现在消费观念已不同从前了(有可能被全球经济危机吓得呵呵～)，基本上2000元以上的手机就不看了，找了几款什么索爱<a href="http://www.pcpop.com/doc/0/316/316035.shtml">M600i</a>、<a href="http://product.pcpop.com/000039409/Index.html">880i</a>以及夏新<a href="http://product.pcpop.com/000037601/Index.html">E78</a>...最后还是回发现干麻不买个NOKIA智能机的呢，我在W810前就是用的NOKIA6630呀，当时感觉智能机很强大很DIY。最后发现淘宝上N72行货价格已经掉到1300左右(刚出时得有三四千了)，还给开发票和全国联保，OMG超值，就是它了.....　</p>
<p>　　没想到那个<a href="http://store.taobao.com/shop/view_shop-a7f125c3d485cf0333a5c325baeb20b9.htm">卖家</a>别看信用值不高，东西相对便宜，服务态度到是超好，基本上算是送了个1GB卡，周日拍周一晚上就收到货了，一看包装写着是空运...东西也不错，开封后机器没有任何问题，还有正规发票。有的信用值不高的卖家估计是想薄利多销招揽客户吧，不像有的几个钻或者是大皇冠的卖家，买个东西好像还不是很热情的样子，也有可能是客户多忙不过来了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说说N72，基实和我在w810之前用过的6630没啥太多区别，都是NOKIA S60系统，就是外形小了一点，薄了一点点，内存大了些，这回是1GB存储卡、摄像头由130万变成200万,多了FM收音功能，操作系统版本新了些。我基本上当它是新版6630用，呵呵～</p>
<p>　　值得一提的是，NOKIA的耳机一般音质像地摊货，这回的也一样，打开包装原配的耳机就扔到了一边，我用NOKIA的AD-15转换器(一种NOKIA专用耳机转接器,外加功率放大功能的小东西)接上我的森海塞耳PX200，呵呵～～音质超爽，几乎已超越了W810的音质，但是另一种风格不像是日系随身听低音很闷的那种。但是很奇怪如果接SonyE888音质就不怎么地，费解中..。自此以后又可以下载S60各种应用软件、游戏、MP3播放软件....重回NOKIA的智能DIY世界......也许哪天花几百搞个蓝牙GPS定位器，装个地图软件，就可以实现手机GPS定位了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.blogjava.net/images/blogjava_net/michaelcao/WindowsLiveWriter/NOKIA_1339A/n72_4.jpg"><img style="border: 0px none ;" alt="n72" src="http://www.blogjava.net/images/blogjava_net/michaelcao/WindowsLiveWriter/NOKIA_1339A/n72_thumb_1.jpg" border="0" height="197" width="244" /></a> <a href="http://www.blogjava.net/images/blogjava_net/michaelcao/WindowsLiveWriter/NOKIA_1339A/6630_2.jpg"><img style="border: 0px none ;" alt="6630" src="http://www.blogjava.net/images/blogjava_net/michaelcao/WindowsLiveWriter/NOKIA_1339A/6630_thumb.jpg" border="0" height="197" width="244" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n72&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6630</p>
<img src ="http://www.blogjava.net/michaelcao/aggbug/234121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/michaelcao/" target="_blank">依然Fantasy</a> 2008-10-13 22:59 <a href="http://www.blogjava.net/michaelcao/archive/2008/10/13/234121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>