??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一卡一卡二新区无人区,亚洲精品国产成人专区,亚洲AV永久无码精品放毛片http://m.tkk7.com/tbwshc/zh-cnMon, 12 May 2025 02:34:42 GMTMon, 12 May 2025 02:34:42 GMT60Java调用SQL Server的存储过E详?/title><link>http://m.tkk7.com/tbwshc/archive/2013/10/24/405615.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Thu, 24 Oct 2013 09:05:00 GMT</pubDate><guid>http://m.tkk7.com/tbwshc/archive/2013/10/24/405615.html</guid><wfw:comment>http://m.tkk7.com/tbwshc/comments/405615.html</wfw:comment><comments>http://m.tkk7.com/tbwshc/archive/2013/10/24/405615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/tbwshc/comments/commentRss/405615.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/tbwshc/services/trackbacks/405615.html</trackback:ping><description><![CDATA[<p>1使用不带参数的存储过E?/p> <p>  1</p> <p>  {call procedure-name}</p> <p>  作ؓ实例Q在 SQL Server 2005 AdventureWorks CZ数据库中创徏以下存储q程Q?/p> <p>  CREATE PROCEDURE GetContactFormalNames</p> <p>  AS BEGIN SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName</p> <p>  FROM Person.Contact END</p> <p>  此存储过E返回单个结果集Q其中包含一列数??Person.Contact 表中前十个联pMh的称呹{名U和姓氏l成)?/p> <p>  在下面的实例中,向此函C?AdventureWorks CZ<strong><a style="color: #000000" ><strong>tb</strong></a></strong>数据库的打开q接Q然后?executeQuery Ҏ调用 GetContactFormalNames 存储q程?/p> <p>  public static void executeSprocNoParams(Connection con)</p> <p>  …{</p> <p>  try …{</p> <p>  Statement stmt = con.createStatement();</p> <p>  ResultSet rs = stmt.executeQuery("{call dbo.GetContactFormalNames}");</p> <p>  while (rs.next())</p> <p>  …{</p> <p>  System.out.println(rs.getString("FormalName"));</p> <p>  }</p> <p>  rs.close();</p> <p>  stmt.close();</p> <p>  }</p> <p>  catch (Exception e)</p> <p>  …{</p> <p>  e.printStackTrace();</p> <p>  }</p> <p>  }</p> <p>  2使用带有输入参数的存储过E?/p> <p>  使用 JDBC 驱动E序调用带参数的存储q程Ӟ必须l合 SQLServerConnection cȝ prepareCall Ҏ使用 call SQL 转义序列。带?IN 参数?call 转义序列的语法如下所C:</p> <p>  {call procedure-name[([parameter][,[parameter]]…)]}http://jie.baijiale.94ibc.com</p> <p>  构?call 转义序列Ӟ请??(问号)字符来指?IN 参数。此字符充当要传递给该存储过E的参数值的占位W。可以?SQLServerPreparedStatement cȝ setter Ҏ之一为参数指定倹{可使用?setter Ҏ?IN 参数的数据类型决定?/p> <p>  ?setter Ҏ传递值时Q不仅需要指定要在参C使用的实际|q必L定参数在存储q程中的序数位置。例如,如果存储q程包含单个 IN 参数Q则其序数gؓ 1.如果存储q程包含两个参数Q则W一个序数gؓ 1,W二个序数gؓ 2.</p> <p>  作ؓ如何调用包含 IN 参数的存储过E的实例Q?SQL Server 2005 AdventureWorks CZ数据库中?uspGetEmployeeManagers 存储q程。此存储q程接受名ؓ EmployeeID 的单个输入参?/p><img src ="http://m.tkk7.com/tbwshc/aggbug/405615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/tbwshc/" target="_blank">chen11-1</a> 2013-10-24 17:05 <a href="http://m.tkk7.com/tbwshc/archive/2013/10/24/405615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中生成文件的10徏?/title><link>http://m.tkk7.com/tbwshc/archive/2013/10/24/405614.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Thu, 24 Oct 2013 09:04:00 GMT</pubDate><guid>http://m.tkk7.com/tbwshc/archive/2013/10/24/405614.html</guid><wfw:comment>http://m.tkk7.com/tbwshc/comments/405614.html</wfw:comment><comments>http://m.tkk7.com/tbwshc/archive/2013/10/24/405614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/tbwshc/comments/commentRss/405614.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/tbwshc/services/trackbacks/405614.html</trackback:ping><description><![CDATA[<p>1. C - "少好"qL如此(Keep in Mind – "Less is more" is not always better)?– 高效率的代码是g好事Q但很多情况下,q代码行数少效率p?/p> <p>  2. 不要把简单事情复杂化(Do not complicate things)?– 我曾l这么做q,我相信你也一栗开发者都們֐于采用复杂方式解决简单问题。我们在一个只?个用Lpȝ中引入EJB,Z个ƈ不需要框架的应用实现一套框Ӟ采用属性文件、采用面?a style="color: #000000" >tb</a>对象解决Ҏ、用线E,而这些根本用不着。ؓ什么会q么做?一些h可能不知道有更好的解x案,但另一些h可能故意q样做来学习新知识,或仅仅是因ؓ有趣。对那些不知道更好解x案的人,要多听有l验E序员的。对于那些纯_出于个人目的而将设计复杂化的人,我徏议你要更加专业一炏V?br />  3. 不要"编?(No hard coding please)?– ׃旉紧迫Q开发者L会忘记或故意忽略q一条。然而另一U可能是Q遵循这条戒律,我们׃会陷?旉紧迫"的困境。定义一个static final 变量Q增加一行代码,又能花多长时间呢Q?/p> <p>  4. Z码添加注?Add comments to your code)?– 每个人都知道q一点,但不是每个h都会q么做。你有多次"忘记"d注释了?实Q注释不会ؓ你的E序增加M函数功能。但是,有多次Q看?周前写的代码Q你都记不v它是q什么的Q你很幸q,那些未注释的代码是你自己写的Q你脑v中还会有D存的印象。非怸q,大多时候,代码是别人写的,q且那个人很可能已经d公司了。有句谚语说的好Q?有来有往Q互惠互?,因此E序员应该体谅彼?q有你自?Q给你的代码加上注释?/p> <p> </p><img src ="http://m.tkk7.com/tbwshc/aggbug/405614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/tbwshc/" target="_blank">chen11-1</a> 2013-10-24 17:04 <a href="http://m.tkk7.com/tbwshc/archive/2013/10/24/405614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>针对Java Excel API及详l教E?/title><link>http://m.tkk7.com/tbwshc/archive/2013/10/24/405613.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Thu, 24 Oct 2013 09:02:00 GMT</pubDate><guid>http://m.tkk7.com/tbwshc/archive/2013/10/24/405613.html</guid><wfw:comment>http://m.tkk7.com/tbwshc/comments/405613.html</wfw:comment><comments>http://m.tkk7.com/tbwshc/archive/2013/10/24/405613.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/tbwshc/comments/commentRss/405613.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/tbwshc/services/trackbacks/405613.html</trackback:ping><description><![CDATA[<p>时在java开发中会操作excel表格Q其实操作v来也特别单。这里把前期操作步骤说一下,本文会简单的介绍一个开放源码项目:Java Excel ApiQ用它大家可以方便的操作Excel文g了?/p> <p>  首先下蝲好:Java Excel ApiQ这个文件我已经?JAVA+Excel+API详细教程。pdf一q压~上传了Q感兴趣的朋友可以下?</p> <p>  我这里用的开发^台是EclipseQ这里我把操作简单说一下:</p> <p>  1Q?建,立java目Q在q个目在徏立一个新的文件夹lib;</p> <p>  2Q?jxl.jarQ即Java Excel ApQ复制到lib</p> <p>  3Q然后右键点击这个java目Q?a style="color: #000000" >tb</a>选择Propertieshttp://jie.baijiale.ibc198.com</p> <p>  4Q在左侧列表里选中Java Build Path Q右侧选中Libraries</p> <p>  5Q点击Add JARs</p> <p>  6Q?然后去选择q个目中lib文g夹中的jxl.jarQ点ȝ?/p> <p>  成功后,目中会多一个文件夹为:Referenced Libraries</p> <p>  准备工作完成后,可以去操作excel了,</p><img src ="http://m.tkk7.com/tbwshc/aggbug/405613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/tbwshc/" target="_blank">chen11-1</a> 2013-10-24 17:02 <a href="http://m.tkk7.com/tbwshc/archive/2013/10/24/405613.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>框架Quart在Java中Q务调度的使用http://m.tkk7.com/tbwshc/archive/2013/09/17/404183.htmlchen11-1chen11-1Tue, 17 Sep 2013 07:15:00 GMThttp://m.tkk7.com/tbwshc/archive/2013/09/17/404183.htmlhttp://m.tkk7.com/tbwshc/comments/404183.htmlhttp://m.tkk7.com/tbwshc/archive/2013/09/17/404183.html#Feedback0http://m.tkk7.com/tbwshc/comments/commentRss/404183.htmlhttp://m.tkk7.com/tbwshc/services/trackbacks/404183.html  Quartz框架是一个全功能、开源的d调度服务Q可以集成几乎Q何的java应用E序—从小的单片机pȝ到大型的电子商务pȝ。Quartz可以执行上千上万的Q务调度?/p>

  核心概念

  Quartz核心的概念:schedulerd调度、Jobd、Trigger触发器、JobDetaildl节

  JobdQ其实Job是接口,其中只有一个executeҎQ?/p>

  package org.quartz;

  public abstract interface Job

  {

  public abstract void execute(JobExecutionContext paramJobExecutionContext)

  throws JobExecutionException;

  }

  我们开发者只要实现此接口Q实现executeҎ卛_。把我们惛_的事情,在execute中执行即可?/p>

  JobDetailQQ务细节,Quartz执行JobӞ需要新ZJob实例Q但是不能直接操作Jobc,所以通过JobDetail来获取Job的名U、描qC息?/p>

  Trigger触发器:执行d的规?比如每天Q每时{?/p>

  一般情况用SimpleTriggerQ和CronTriggerQ这个触发器实现了Trigger接口?/p>

  对于复杂的时间表辑ּ来说Q比如每个月15日上午几点几分,使用CronTrigger

  对于单的旉来说Q比如每天执行几ơ,使用SimpleTrigger

  schedulerd调度Q是最核心的概念,需要把JobDetail和Trigger注册到scheduler中,才可以执行?/p>

  注意Q?/p>

  不同的版本的jar包,具体的操作不太相同,但是tbw思\是相同的;比如1.8.6jar包中QJobDetail是个c,直接通过构造方法与Jobcd联。SimpleTrigger和CornTrigger是类;?.0.2jar包中QJobDetail是个接口QSimpleTrigger和CornTrigger是接?/p>

  不同版本试Q?/p>

  1.8.6jar包:

  [html]

  package com.test;

  import java.util.Date;

  import org.quartz.Job;

  import org.quartz.JobExecutionContext;

  import org.quartz.JobExecutionException;

  /**

  * 需要执行的d

  * @author lhy

  *

  */

  public class MyJob implements Job {

  @Override

  //把要执行的操作,写在executeҎ?/p>

  public void execute(JobExecutionContext arg0) throws JobExecutionException {

  System.out.println("试Quartz"+new Date());

  }

  }

  package com.test;

  import java.util.Date;

  import org.quartz.Job;

  import org.quartz.JobExecutionContext;

  import org.quartz.JobExecutionException;

  /**

  * 需要执行的d

  * @author lhy

  *

  */

  public class MyJob implements Job {

  @Override

  //把要执行的操作,写在executeҎ?/p>

  public void execute(JobExecutionContext arg0) throws JobExecutionException {

  System.out.println("试Quartz"+new Date());

  }

  }

  使用SimpleTrigger触发?/p>

  [html]

  package com.test;

  import java.util.Date;

  import org.quartz.JobDetail;

  import org.quartz.Scheduler;

  import org.quartz.SchedulerException;

  import org.quartz.SchedulerFactory;

  import org.quartz.SimpleTrigger;

  import org.quartz.impl.StdSchedulerFactory;

  /**

  * 调用d的类

  * @author lhy

  *

  */

  public class SchedulerTest {

  public static void main(String[] args) {

  //通过schedulerFactory获取一个调度器

  SchedulerFactory schedulerfactory=new StdSchedulerFactory();

  Scheduler scheduler=null;

  try{

  // 通过schedulerFactory获取一个调度器

  scheduler=schedulerfactory.getScheduler();

  // 创徏jobDetail实例Q绑定Job实现c?/p>

  // 指明job的名Uͼ所在组的名Uͼ以及l定jobc?/p>

  JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);

  // 定义调度触发规则Q比如每1U运行一ơ,p??/p>

  SimpleTrigger simpleTrigger=new SimpleTrigger("simpleTrigger","triggerGroup");

  // 马上启动

  simpleTrigger.setStartTime(new Date());

  // 间隔旉

  simpleTrigger.setRepeatInterval(1000);

  // q行ơ数

  simpleTrigger.setRepeatCount(8);

  // 把作业和触发器注册到d调度?/p>

  scheduler.scheduleJob(jobDetail, simpleTrigger);

  // 启动调度

  scheduler.start();

  }catch(SchedulerException e){

  e.printStackTrace();

  }

  }

  }

  package com.test;

  import java.util.Date;

  import org.quartz.JobDetail;

  import org.quartz.Scheduler;

  import org.quartz.SchedulerException;

  import org.quartz.SchedulerFactory;

  import org.quartz.SimpleTrigger;

  import org.quartz.impl.StdSchedulerFactory;

  /**

  * 调用d的类

  * @author lhy

  *

  */

  public class SchedulerTest {

  public static void main(String[] args) {

  //通过schedulerFactory获取一个调度器

  SchedulerFactory schedulerfactory=new StdSchedulerFactory();

  Scheduler scheduler=null;

  try{

  // 通过schedulerFactory获取一个调度器

  scheduler=schedulerfactory.getScheduler();

  // 创徏jobDetail实例Q绑定Job实现c?/p>

  // 指明job的名Uͼ所在组的名Uͼ以及l定jobc?br /> JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);

  // 定义调度触发规则Q比如每1U运行一ơ,p??/p>

  SimpleTrigger simpleTrigger=new SimpleTrigger("simpleTrigger","triggerGroup");

  // 马上启动

  simpleTrigger.setStartTime(new Date());

  // 间隔旉

  simpleTrigger.setRepeatInterval(1000);

  // q行ơ数

  simpleTrigger.setRepeatCount(8);

  // 把作业和触发器注册到d调度?/p>

  scheduler.scheduleJob(jobDetail, simpleTrigger);

  // 启动调度

  scheduler.start();

  }catch(SchedulerException e){

  e.printStackTrace();

  }

  }

  } 若用CornTrigger触发器:

  [html]

  package com.test;

  import java.util.Date;

  import org.quartz.CronTrigger;

  import org.quartz.JobDetail;

  import org.quartz.Scheduler;

  import org.quartz.SchedulerException;

  import org.quartz.SchedulerFactory;

  import org.quartz.SimpleTrigger;

  import org.quartz.impl.StdSchedulerFactory;

  /**

  * 调用d的类

  * @author lhy

  *

  */

  public class CronTriggerTest {

  public static void main(String[] args) {

  //通过schedulerFactory获取一个调度器

  SchedulerFactory schedulerfactory=new StdSchedulerFactory();

  Scheduler scheduler=null;

  try{

  // 通过schedulerFactory获取一个调度器

  scheduler=schedulerfactory.getScheduler();

  // 创徏jobDetail实例Q绑定Job实现c?/p>

  // 指明job的名Uͼ所在组的名Uͼ以及l定jobc?/p>

  JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);

  // 定义调度触发规则Q每天上?0Q?5执行

  CronTrigger cornTrigger=new CronTrigger("cronTrigger","triggerGroup");

  // 执行规则表达?/p>

  cornTrigger.setCronExpression("0 15 10 * * ? *");

  // 把作业和触发器注册到d调度?/p>

  scheduler.scheduleJob(jobDetail, cornTrigger);

  // 启动调度

  scheduler.start();

  }catch(Exception e){

  e.printStackTrace();

  }

  }

  }

  package com.test;

  import java.util.Date;

  import org.quartz.CronTrigger;

  import org.quartz.JobDetail;

  import org.quartz.Scheduler;

  import org.quartz.SchedulerException;

  import org.quartz.SchedulerFactory;

  import org.quartz.SimpleTrigger;

  import org.quartz.impl.StdSchedulerFactory;

  /**

  * 调用d的类

  * @author lhy

  *

  */

  public class CronTriggerTest {

  public static void main(String[] args) {

  //通过schedulerFactory获取一个调度器

  SchedulerFactory schedulerfactory=new StdSchedulerFactory();

  Scheduler scheduler=null;

  try{

  // 通过schedulerFactory获取一个调度器

  scheduler=schedulerfactory.getScheduler();

  // 创徏jobDetail实例Q绑定Job实现c?/p>

  // 指明job的名Uͼ所在组的名Uͼ以及l定jobc?/p>

  JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);

  // 定义调度触发规则Q每天上?0Q?5执行

  CronTrigger cornTrigger=new CronTrigger("cronTrigger","triggerGroup");

  // 执行规则表达?/p>

  cornTrigger.setCronExpression("0 15 10 * * ? *");

  // 把作业和触发器注册到d调度?/p>

  scheduler.scheduleJob(jobDetail, cornTrigger);

  // 启动调度

  scheduler.start();

  }catch(Exception e){

  e.printStackTrace();

  }

  }

  }

  对于2.0.2jar包如下:

  其中的jobcM变,主要是调度类如下Q?/p>

  [html]

  package com.test;

  import java.util.Date;

  import org.quartz.CronScheduleBuilder;

  import org.quartz.JobBuilder;

  import org.quartz.JobDetail;

  import org.quartz.Scheduler;

  import org.quartz.SchedulerException;

  import org.quartz.SchedulerFactory;

  import org.quartz.SimpleScheduleBuilder;

  import org.quartz.Trigger;

  import org.quartz.TriggerBuilder;

  import org.quartz.impl.StdSchedulerFactory;

  /**

  * 调用d的类

  * @author lhy

  *

  */

  public class SchedulerTest {

  public static void main(String[] args) {

  //通过schedulerFactory获取一个调度器

  SchedulerFactory schedulerfactory=new StdSchedulerFactory();

  Scheduler scheduler=null;

  try{

  // 通过schedulerFactory获取一个调度器

  scheduler=schedulerfactory.getScheduler();

  // 创徏jobDetail实例Q绑定Job实现c?/p>

  // 指明job的名Uͼ所在组的名Uͼ以及l定jobc?/p>

  JobDetail job=JobBuilder.newJob(MyJob.class).withIdentity("job1", "jgroup1").build();

  // 定义调度触发规则

  // 使用simpleTrigger规则

  // Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")

  // .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withRepeatCount(8))

  // .startNow().build();

  // 使用cornTrigger规则 每天10?2?/p>

  Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")

  .withSchedule(CronScheduleBuilder.cronSchedule("0 42 10 * * ? *"))

  .startNow().build();

  // 把作业和触发器注册到d调度?/p>

  scheduler.scheduleJob(job, trigger);

  // 启动调度

  scheduler.start();

  }catch(Exception e){

  e.printStackTrace();

  }

  }

  }

  package com.test;

  import java.util.Date;

  import org.quartz.CronScheduleBuilder;

  import org.quartz.JobBuilder;

  import org.quartz.JobDetail;

  import org.quartz.Scheduler;

  import org.quartz.SchedulerException;

  import org.quartz.SchedulerFactory;

  import org.quartz.SimpleScheduleBuilder;

  import org.quartz.Trigger;

  import org.quartz.TriggerBuilder;

  import org.quartz.impl.StdSchedulerFactory;

  /**

  * 调用d的类

  * @author lhy

  *

  */

  public class SchedulerTest {

  public static void main(String[] args) {

  //通过schedulerFactory获取一个调度器

  SchedulerFactory schedulerfactory=new StdSchedulerFactory();

  Scheduler scheduler=null;

  try{

  // 通过schedulerFactory获取一个调度器

  scheduler=schedulerfactory.getScheduler();

  // 创徏jobDetail实例Q绑定Job实现c?/p>

  // 指明job的名Uͼ所在组的名Uͼ以及l定jobc?/p>

  JobDetail job=JobBuilder.newJob(MyJob.class).withIdentity("job1", "jgroup1").build();

  // 定义调度触发规则

  // 使用simpleTrigger规则

  // Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")

  // .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withRepeatCount(8))

  // .startNow().build();

  // 使用cornTrigger规则 每天10?2?/p>

  Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")

  .withSchedule(CronScheduleBuilder.cronSchedule("0 42 10 * * ? *"))

  .startNow().build();

  // 把作业和触发器注册到d调度?/p>

  scheduler.scheduleJob(job, trigger);

  // 启动调度

  scheduler.start();

  }catch(Exception e){

  e.printStackTrace();

  }

  }

  }

  上述demo下蝲Q?.8版本demo下蝲

  2.0版本demo下蝲

  对于CornExpress讲解如下Q?/p>

  字段 允许?允许的特D字W?/p>

  U?0-59 , - * /

  ?0-59 , - * /

  时 0-23 , - * /

  日期 1-31 , - * ? / L W C

  月䆾 1-12 或?JAN-DEC , - * /

  星期 1-7 或?SUN-SAT , - * ? / L C #

  q?可? 留空, 1970-2099 , - * /

  表达?意义

  "0 0 12 * * ?" 每天中午12点触?/p>

  "0 15 10 ? * *" 每天上午10:15触发

  "0 15 10 * * ?" 每天上午10:15触发

  "0 15 10 * * ? *" 每天上午10:15触发

  "0 15 10 * * ? 2005" 2005q的每天上午10:15触发

  "0 * 14 * * ?" 在每天下?点到下午2:59期间的每1分钟触发

  "0 0/5 14 * * ?" 在每天下?点到下午2:55期间的每5分钟触发

  "0 0/5 14,18 * * ?" 在每天下?点到2:55期间和下?点到6:55期间的每5分钟触发

  "0 0-5 14 * * ?" 在每天下?点到下午2:05期间的每1分钟触发

  "0 10,44 14 ? 3 WED" 每年三月的星期三的下?:10?:44触发

  "0 15 10 ? * MON-FRI" 周一臛_五的上午10:15触发

  "0 15 10 15 * ?" 每月15日上?0:15触发

  "0 15 10 L * ?" 每月最后一日的上午10:15触发

  "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发

  "0 15 10 ? * 6L 2002-2005" 2002q至2005q的每月的最后一个星期五上午10:15触发

  "0 15 10 ? * 6#3" 每月的第三个星期五上?0:15触发

  Ҏ字符 意义

  * 表示所有?

  ? 表示未说明的|即不兛_它ؓ何?

  - 表示一个指定的范围;

  , 表示附加一个可能?

  / W号前表C开始时_W号后表C每ơ递增的?

  L("last") ("last") "L" 用在day-of-month字段意思是 "q个月最后一?;用在 day-of-week字段, 它简单意思是 "7" or "SAT"?如果在day-of-week字段里和数字联合使用Q它的意思就?"q个月的最后一个星期几" – 例如Q?"6L" means "q个月的最后一个星期五". 当我们用“L”Ӟ不指明一个列表值或者范围是很重要的Q不然的话,我们会得C些意想不到的l果?/p>

  W("weekday") 只能用在day-of-month字段。用来描叙最接近指定天的工作?周一到周?。例如:在day-of-month字段?#8220;15W”?#8220;最接近q个月第15天的工作?#8221;Q即如果q个月第15天是周六Q那么触发器会在这个月W?4天即周五触发;如果q个月第15天是周日Q那么触发器会在这个月W?6天即周一触发;如果q个月第15天是周二Q那么就?strong>tbw触发器这天触发。注意一点:q个用法只会在当前月计算|不会过当前月?#8220;W”字符仅能在day-of-month指明一天,不能是一个范围或列表。也可以?#8220;LW”来指定这个月的最后一个工作日?/p>

  # 只能用在day-of-week字段。用来指定这个月的第几个周几。例Q在day-of-week字段?6#3"指这个月W?个周?6指周五,3指第3?。如果指定的日期不存在,触发器就不会触发?/p>

  C 指和calendar联系后计过的倹{例Q在day-of-month 字段?#8220;5C”指在q个月第5天或之后包括calendar的第一?在day-of-week字段?#8220;1C”指在q周日或之后包括calendar的第一?/p>

chen11-1 2013-09-17 15:15 发表评论
]]>
序列化在IO中读写对象的使用http://m.tkk7.com/tbwshc/archive/2013/09/17/404182.htmlchen11-1chen11-1Tue, 17 Sep 2013 07:12:00 GMThttp://m.tkk7.com/tbwshc/archive/2013/09/17/404182.htmlhttp://m.tkk7.com/tbwshc/comments/404182.htmlhttp://m.tkk7.com/tbwshc/archive/2013/09/17/404182.html#Feedback0http://m.tkk7.com/tbwshc/comments/commentRss/404182.htmlhttp://m.tkk7.com/tbwshc/services/trackbacks/404182.html    序列化就是一U用来处理对象流的机Ӟ所谓对象流也就是将对象的内容进行流化。可以对化后的对象q行d操作Q也可将化后的对象传输于网l之间。序列化是ؓ了解军_对对象流q行d操作时所引发的问题?/p>

  序列化的实现Q将需要被序列化的cd现Serializable接口Q然后用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象?对象Q接着Q用ObjectOutputStream对象的writeObject(Object obj)Ҏ可以将参数为obj的对象写?即保存其状?Q要恢复的话则用输入?br /> 写对象和d象的时候一定要使用序列化:

  import java.io.*;

  class Product implements Serializable {

  private static final long serialVersionUID = 1L;

  private float price;

  private float tax;

  public Product(float price) {

  this.price = price;

  tax = (float)(price*0.20);

  }

  public String toString() {

  return "price:"+price+",tax:"+tax;

  }

  }

  public class CmdDemo {

  public static void main(String[] strtb) throws Exception {

  Product p1 = new Product(100);

  ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream

  ("d:\product.txt"));

  os.writeObject(p1);

  os.close();

  ObjectInputStream is = new ObjectInputStream(new FileInputStream

  ("d:\product.txt"));

  Product p2 = (Product) is.readObject();

  System.out.println(p2.toString());

  }

  }



chen11-1 2013-09-17 15:12 发表评论
]]>
Java数组使用实用的技?/title><link>http://m.tkk7.com/tbwshc/archive/2013/09/17/404181.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 17 Sep 2013 07:08:00 GMT</pubDate><guid>http://m.tkk7.com/tbwshc/archive/2013/09/17/404181.html</guid><wfw:comment>http://m.tkk7.com/tbwshc/comments/404181.html</wfw:comment><comments>http://m.tkk7.com/tbwshc/archive/2013/09/17/404181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/tbwshc/comments/commentRss/404181.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/tbwshc/services/trackbacks/404181.html</trackback:ping><description><![CDATA[<p>  本文分n了关于Java数组最?1大方法,帮助你解军_作流E问题,无论是运用在团队环境或是在私人项目中Q你都可以直接拿来用Q?</p> <p>0.  声明一个数l(Declare an arrayQ?<br /> <br />String[] aArray = new String[5];<br />String[] bArray = {"a","b","c", "d", "e"};<br />String[] cArray = new String[]{"a","b","c","d","e"};</p> <p>1.  在Java中输Z个数l(Print an array in JavaQ?br /> <br />int[] intArray = { 1, 2, 3, 4, 5 };<br />String intArrayString = Arrays.toString(intArray);<br />  <br />// print directly will print reference value<br />System.out.println(intArray);<br />// [I@7150bd4d<br />  <br />System.out.println(intArrayString);<br />// [1, 2, 3, 4, 5]</p> <p>2. 从数l中创徏数组列表QCreate an ArrayList from an arrayQ?br /> <br />String[] stringArray = { "a", "b", "c", "d", "e" };<br />ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));<br />System.out.println(arrayList);<br />// [a, b, c, d, e]</p> <p>3. ?strong><a style="color: #000000" ><strong>爱淘?/strong></a></strong>数组中是否包含特定|Check if an array contains a certain valueQ?br /> <br />String[] stringArray = { "a", "b", "c", "d", "e" };<br />boolean b = Arrays.asList(stringArray).contains("a");<br />System.out.println(b);<br />// true<br /> <br />4. q接两个数组Q?Concatenate two arraysQ?br /> <br />int[] intArray = { 1, 2, 3, 4, 5 };<br />int[] intArray2 = { 6, 7, 8, 9, 10 };<br />// Apache Commons Lang library<br />int[] combinedIntArray = ArrayUtils.addAll(intArray, intArray2);<br />5. 声明一个数l内链(Declare an array inline Q?br /> <br />method(new String[]{"a", "b", "c", "d", "e"});<br /> <br />6. 数l元素加入到一个独立的字符串中QJoins the elements of the provided array into a single StringQ?/p> <p>// containing the provided list of elements<br />// Apache common lang<br />String j = StringUtils.join(new String[] { "a", "b", "c" }, ", ");<br />System.out.println(j);<br />// a, b, c<br />  <br />7. 数l列表{换成一个数l?QCovnert an ArrayList to an arrayQ?<br />  <br />String[] stringArray = { "a", "b", "c", "d", "e" };<br />ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));<br />String[] stringArr = new String[arrayList.size()];<br />arrayList.toArray(stringArr);<br />for (String s : stringArr)<br />    System.out.println(s);<br /> <br />8. 数l{换成一个集合(Convert an array to a setQ?<br /> <br />Set<String> set = new HashSet<String>(Arrays.asList(stringArray));<br />System.out.println(set);<br />//[d, e, b, c, a]<br /> <br />9. 反向数组QReverse an arrayQ?br /> <br />int[] intArray = { 1, 2, 3, 4, 5 };<br />ArrayUtils.reverse(intArray);<br />System.out.println(Arrays.toString(intArray));<br />//[5, 4, 3, 2, 1]<br /> <br />10. 删除数组元素QRemove element of an arrayQ?br /> <br />int[] intArray = { 1, 2, 3, 4, 5 };<br />int[] removed = ArrayUtils.removeElement(intArray, 3);<br />//create a new array<br />System.out.println(Arrays.toString(removed));<br /> <br />One more – convert int to byte array <br /> <br />byte[] bytes = ByteBuffer.allocate(4).putInt(8).array();<br />  <br />for (byte t : bytes) {<br />   System.out.format("0x%x ", t);<br />}</p><img src ="http://m.tkk7.com/tbwshc/aggbug/404181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/tbwshc/" target="_blank">chen11-1</a> 2013-09-17 15:08 <a href="http://m.tkk7.com/tbwshc/archive/2013/09/17/404181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java动态代理设计模?/title><link>http://m.tkk7.com/tbwshc/archive/2013/09/10/403910.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 10 Sep 2013 09:08:00 GMT</pubDate><guid>http://m.tkk7.com/tbwshc/archive/2013/09/10/403910.html</guid><wfw:comment>http://m.tkk7.com/tbwshc/comments/403910.html</wfw:comment><comments>http://m.tkk7.com/tbwshc/archive/2013/09/10/403910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/tbwshc/comments/commentRss/403910.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/tbwshc/services/trackbacks/403910.html</trackback:ping><description><![CDATA[<p> 所谓动态代理类是在q行时生成的classQ在生成它时Q你必须提供一linterfacel它Q则动态代理类宣U它实现了这些interface。当Ӟ动态代理类充当一个代理,你不要企囑֮会帮你干实质性的工作Q在生成它的实例时你必须提供一个handlerQ由它接实际的工作?br />  下面通过实例来说明:<br />  Subject.java 抽象借口Q声明代理对象和真实对象的共同接?br />  [java]<br />  public interface Subject {<br />  public void doSomething();<br />  }<br />  public interface Subject {<br />  public void doSomething();<br />  }<br />  RealSubject.java 真实?a style="color: #000000" ><strong>tb</strong></a>代理对象<br />  [java]<br />  public class RealSubject implements Subject {<br />  @Override<br />  public void doSomething() {<br />  System.out.println("RealSubject.doSomething");<br />  }<br />  }<br />  public class RealSubject implements Subject {<br />  @Override<br />  public void doSomething() {<br />  System.out.println("RealSubject.doSomething");<br />  }<br />  }</p> <p>  DynamicProxy.java 代理对象<br />  [java]<br />  import java.lang.reflect.InvocationHandler;<br />  import java.lang.reflect.Method;<br />  public class DynamicProxy implements InvocationHandler {<br />  private Object object;<br />  public DynamicProxy(Object object) {<br />  this.object = object;<br />  }<br />  @Override<br />  public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {<br />  System.out.println("Before Invoke ! method : " + method);<br />  //我们可以再代理方法调用前后添加功?br />  Object result = method.invoke(object, args);<br />  System.out.println("object : " + object + " result : " + result + " args : " + args);<br />  System.out.println("After Invoke !");<br />  return result;<br />  }<br />  }<br />  import java.lang.reflect.InvocationHandler;<br />  import java.lang.reflect.Method;<br />  public class DynamicProxy implements InvocationHandler {<br />  private Object object;<br />  public DynamicProxy(Object object) {<br />  this.object = object;<br />  }<br />  @Override<br />  public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {<br />  System.out.println("Before Invoke ! method : " + method);<br />  //我们可以再代理方法调用前后添加功?br />  Object result = method.invoke(object, args);<br />  System.out.println("object : " + object + " result : " + result + " args : " + args);<br />  System.out.println("After Invoke !");<br />  return result;<br />  }<br />  }<br />  Client.java 试<br />  [java]<br />  import java.lang.reflect.InvocationHandler;<br />  import java.lang.reflect.Proxy;<br />  public class Client {<br />  public static void main(String[] args) throws Exception {<br />  //创徏目标对象Q也是被代理对?br />  RealSubject realSubject = new RealSubject();<br />  //目标对象交l代?br />  InvocationHandler handler = new DynamicProxy(realSubject);<br />  // Class proxyClass = Proxy.getProxyClass(Subject.class.getClassLoader()<br />  // , new Class[]{Subject.class});<br />  // Subject subject = (Subject)proxyClass.getConstructor(new Class[]{InvocationHandler.class})<br />  // .newInstance(new Object[]{handler});<br />  //q回代理对象Q相当于上面两句<br />  Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(),<br />  realSubject.getClass().getInterfaces(),<br />  handler);<br />  //叫代理对象去doSomething()Q其实在代理对象中的doSomething()中还是会<br />  //用handler来调用invoke(proxy, method, args) 参数proxy用者subject(this)Q?br />  //method为doSomething()Q?strong><a style="color: #000000" ><strong>tb</strong></a></strong>参数为方法要传入的参敎ͼq里没有<br />  subject.doSomething();<br />  }<br />  }<br />  import java.lang.reflect.InvocationHandler;<br />  import java.lang.reflect.Proxy;<br />  public class Client {<br />  public static void main(String[] args) throws Exception {<br />  //创徏目标对象Q也是被代理对?br />  RealSubject realSubject = new RealSubject();<br />  //目标对象交l代?br />  InvocationHandler handler = new DynamicProxy(realSubject);<br />  // Class proxyClass = Proxy.getProxyClass(Subject.class.getClassLoader()<br />  // , new Class[]{Subject.class});<br />  // Subject subject = (Subject)proxyClass.getConstructor(new Class[]{InvocationHandler.class})<br />  // .newInstance(new Object[]{handler});<br />  //q回代理对象Q相当于上面两句<br />  Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(),<br />  realSubject.getClass().getInterfaces(),<br />  handler);<br />  //叫代理对象去doSomething()Q其实在代理对象中的doSomething()中还是会<br />  //用handler来调用invoke(proxy, method, args) 参数proxy用者subject(this)Q?br />  //method为doSomething()Q参CؓҎ要传入的参数Q这里没?br />  subject.doSomething();<br />  }<br />  }<br />  打印l果Q?br />  Before Invoke ! method : public abstract void Subject.doSomething()<br />  RealSubject.doSomething<br />  object : RealSubject@ec6b00 result : null args : null<br />  After Invoke !<br />  注意Q?br />  Java动态代理涉及到的两个类Q?br />  InvocationHandlerQ该接口中仅定义了一个Object : invoke(Object proxy, Method method, Object[] args);参数proxy指代理类Qmethod表示被代理的ҎQargs为method中的参数数组Q返回值ObjectZ理实例的Ҏ调用q回的倹{这个抽象方法在代理cM动态实现?br />  ProxyQ所有动态代理类的父c,提供用于创徏动态代理类和实例的静态方法?/p><img src ="http://m.tkk7.com/tbwshc/aggbug/403910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/tbwshc/" target="_blank">chen11-1</a> 2013-09-10 17:08 <a href="http://m.tkk7.com/tbwshc/archive/2013/09/10/403910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>30条有用的 Java ~程规则http://m.tkk7.com/tbwshc/archive/2013/08/23/403247.htmlchen11-1chen11-1Fri, 23 Aug 2013 08:56:00 GMThttp://m.tkk7.com/tbwshc/archive/2013/08/23/403247.htmlhttp://m.tkk7.com/tbwshc/comments/403247.htmlhttp://m.tkk7.com/tbwshc/archive/2013/08/23/403247.html#Feedback0http://m.tkk7.com/tbwshc/comments/commentRss/403247.htmlhttp://m.tkk7.com/tbwshc/services/trackbacks/403247.html (1) cd首字母应该大写。字Dc方法以及对?句柄)的首字母应小写。对于所有标识符Q其中包含的所有单词都应紧靠在一P而且大写中间单词的首?母。例如:
  ThisIsAClassName
  thisIsMethodOrFieldName
  若在定义中出C常数初始化字W,则大写static final基本cd标识W中的所有字母。这样便可标志出它们属于~译期的常数?br />  Java?Package)属于一U特D情况:它们全都是小写字母,即便中间的单词亦是如此。对于域名扩展名Uͼ如comQorgQnet或者edu {,全部都应写(q也是Java 1.1和Java 1.2的区别之一)?br />  (2) Z常规用途而创Z个类Ӟ请采?#8220;tbl典形式”Qƈ包含对下q元素的定义Q?br />  equals()
  hashCode()
  toString()
  clone()(implement Cloneable)
  implement Serializable
  (3) 对于自己创徏的每一个类Q都考虑|入一个main()Q其中包含了用于试那个cȝ代码。ؓ使用一个项目中的类Q我们没必要删除试代码。若 q行了Q何Ş式的改动Q可方便地返回测试。这些代码也可作为如何用类的一个示例用?br />  (4) 应将Ҏ设计成简要的、功能性单元,用它描述和实C个不q箋的类接口部分。理x况下Q方法应明扼要。若长度很大Q可考虑通过某种方式其分割成较短的几个Ҏ。这样做也便于类内代码的重复使用(有些时候,Ҏ必须非常大,但它们仍应只做同L一件事??(5) 设计一个类Ӟ误w处Cؓ客户E序员考虑一?cȝ使用Ҏ应该是非常明的)。然后,再设w处Cؓ理代码的h考虑一?预计有可能进行哪些Ş式的修改Q想想用什么方法可把它们变得更??br />  (6) 使类可能短精悍,而且只解决一个特定的问题。下面是对类设计的一些徏议:
  ■一个复杂的开兌句:考虑采用“多Ş”机制
  ■数量众多的方法涉及到cd差别极大的操作:考虑用几个类来分别实?br />  ■许多成员变量在特征上有很大的差别Q考虑使用几个c??br />  (7) 让一切东襉K可能地“U有”——private。可使库的某一部分“公共?#8221;(一个方法、类或者一个字D늭{?Q就永远不能把它拿出。若拿出Q就可能破坏其他人现有的代码Q他们不得不重新编写和设计。若只公布自己必d布的Q就可放心大胆地改变其他M东西。在多线E环境中Q隐U是特别重要的一个因?#8212;—只有private字段才能在非同步使用的情况下受到保护?br />  (8) 谨惕“巨大对象l合?#8221;。对一些习惯于序~程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的E序Q再把它嵌入一个或两个巨大?对象里。根据编E原理,对象表达的应该是应用E序的概念,而非应用E序本n?br />  (9) 若不得已q行一些不太雅观的~程Q至应该把那些代码|于一个类的内部?br />  (10) M时候只要发现类与类之间l合得非常紧密,需要考虑是否采用内部c,从而改善编码及l护工作(参见W?4?4.1.2节?#8220;用内?cLq代?#8221;)?br />  (11) 可能细致地加上释,q用javadoc注释文档语法生成自己的程序文档?br />  (12) 避免使用“术数字”Q这些数字很难与代码很好地配合。如以后需要修改它Q无疑会成ؓ一场噩梦,因ؓҎ不知?#8220;100”到底是指“数组大小”q是“其他全然不同的东?#8221;。所以,我们应创Z个常敎ͼqؓ其用具有说服力的描q性名Uͼq在整个E序中都采用常数标识W。这样可使程序更易理解以及更易维护?br />  (13) 涉及构徏器和异常的时候,通常希望重新丢弃在构建器中捕LM异常——如果它造成了那个对象的创徏p|。这样一来,调用者就不会以ؓ那个 对象已正地创徏Q从而盲目地l箋?br />  (14) 当客L序员用完对象以后Q若你的c要求进行Q何清除工作,可考虑清除代码置于一个良好定义的Ҏ里,采用cM于cleanup()q样的名字,明确表明自己的用途。除此以外,可在cd攄一个boolean(布尔)标记Q指出对象是否已被清除。在cȝfinalize()Ҏ里,L定对象已被清除,q已丢弃了从RuntimeExceptionl承的一个类(如果q没有的?Q从而指Z个编E错误。在采取象这LҎ之前Q请定 finalize()能够在自qpȝ中工?可能需要调用System.runFinalizersonExit(true)Q从而确?q一行ؓ)?br />  (15) 在一个特定的作用域内Q若一个对象必L?非由tb垃圾攉机制处理)Q请采用下述ҎQ初始化对象;若成功,则立卌入一个含?finally从句的try块,开始清除工作?br />  (16) 若在初始化过E中需要覆?取消)finalize()Q请C调用super.finalize()(若Object属于我们的直接超c,则无此必?。在对finalize()q行覆盖的过E中Q对super.finalize()的调用应属于最后一个行动,而不应是W一个行动,q样可确保在需要基cȝ件的时候它们依然有效?br />  (17) 创徏大小固定的对象集合时Q请它们传输至一个数l?若准备从一个方法里q回q个集合Q更应如此操?。这样一来,我们可享受到数l在~?译期q行cd查的好处。此外,Z用它们,数组的接收者也许ƈ不需要将对象“造型”到数l里?br />  (18) 量使用interfacesQ不要用abstractcR若已知某样东西准备成ؓ一个基c,那么W一个选择应是其变成一?interface(接口)。只有在不得不用方法定义或者成员变量的时候,才需要将其变成一个abstract(抽象)cR接口主要描qC客户希望做什么事情,而一个类则致力于(或允?具体的实施细节?br />  (19) 在构建器内部Q只q行那些对象设为正状态所需的工作。尽可能地避免调用其他方法,因ؓ那些Ҏ可能被其他h覆盖或取消,从而在构徏q程 中生不可预知的l果(参见W?章的详细说明)?br />  (20) 对象不应只是单地容纳一些数?它们的行Z应得到良好的定义?br />  (21) 在现成类的基上创建新cLQ请首先选择“新徏”?#8220;创作”。只有自q设计要求必须l承Ӟ才应考虑q方面的问题。若在本来允许新建的?合用了l承Q则整个设计会变得没有必要地复杂?br />  (22) 用承及Ҏ覆盖来表C为间的差异,而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的承来表示颜色Q这是绝对应该避?的:应直接用一?#8220;颜色”字段?/p>

  (23) 为避免编E时遇到ȝQ请保证在自q路径指到的Q何地方,每个名字都仅对应一个类。否则,~译器可能先扑ֈ同名的另一个类Qƈ报告出错?息。若怀疑自qCc\径问题,误试在c\径的每一个v点,搜烦一下同名的.class文g?br />  (24) 在Java 1.1 AWT 中用事?#8220;适配?#8221;Ӟ特别Ҏ到一个陷阱。若覆盖了某个适配器方法,同时拼写Ҏ没有特别讲究Q最后的l果是新添加一个方法,而不是覆盖现成方法。然而,׃q样做是完全合法的,所以不会从~译器或q行期系l获得Q何出错提C?#8212;—只不q代码的工作变得不正常了?br />  (25) 用合理的设计Ҏ消除“伪功?#8221;。也是_假若只需要创建类的一个对象,׃要提前限制自׃用应用程序,q加上一?#8220;只生成其中一?” 注释。请考虑其装成一?#8220;独生?#8221;的Ş式。若在主E序里有大量散ؕ的代码,用于创徏自己的对象,误虑采纳一U创造性的ҎQ将些代码封装v来?br />  (26) 警惕“分析瘫痪”。请CQ无论如何都要提前了解整个项目的状况Q再去考察其中的细节。由于把握了全局Q可快速认识自己未知的一些因素,?止在考察l节的时候陷?#8220;死逻辑”中?br />  (27) 警惕“q早优化”。首先让它运行v来,再考虑变得更快——但只有在自己必须q样做、而且l证实在某部分代码中的确存在一个性能瓉的时候, 才应q行优化。除非用专门的工具分析瓶颈,否则很有可能是在费自己的时间。性能提升的隐含代h自己的代码变得难于理解,而且难于l护?br />  (28) 误住,阅读代码的时间比写代码的旉多得多。思\清晰的设计可获得易于理解的程序,但注释、细致的解释以及一些示例往往h不可估量的h 倹{无论对你自己,q是对后来的人,它们都是相当重要的。如Ҏ仍有怀疑,那么误惌p图从联机Java文档里找出有用信息时到的挫折,q样或许?你说服?br />  (29) 如认己已q行了良好的分析、设计或者实施,那么L微更换一下思维角度。试试邀请一些外来h?#8212;—q不一定是专家Q但可以是来自本公司其他部门的h。请他们用完全新鲜的眼光考察你的工作Q看看是否能扑և你一度熟视无睹的问题。采取这U方式,往往能在最适合修改的阶D|Z些关键性的问题Q避免品发行后再解决问题而造成的金钱及_֊斚w的损失?br />  (30) 良好的设计能带来最大的回报。简a之,对于一个特定的问题Q通常会花较长的时间才能找CU最恰当的解x案。但一旦找C正确的方法,以后的工作就L多了Q再也不用经历数时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报(甚至无可估量)。而且׃自己倾注了大量心血Q最l获得一个出色的设计ҎQ成功的快感也是令h心动的。坚持抵制草草完工的诱惑——那样做往往得不偿失



chen11-1 2013-08-23 16:56 发表评论
]]>
单多U程Java法相比?/title><link>http://m.tkk7.com/tbwshc/archive/2013/08/23/403246.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Fri, 23 Aug 2013 08:54:00 GMT</pubDate><guid>http://m.tkk7.com/tbwshc/archive/2013/08/23/403246.html</guid><wfw:comment>http://m.tkk7.com/tbwshc/comments/403246.html</wfw:comment><comments>http://m.tkk7.com/tbwshc/archive/2013/08/23/403246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/tbwshc/comments/commentRss/403246.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/tbwshc/services/trackbacks/403246.html</trackback:ping><description><![CDATA[<p>1q程和线E的概念<br />  1.1什么是q程<br />  一个进E就是在一个运行的E序,它有自己独立的内存空?一l系l资?每个q程的内部数据和状态都是独立的,例如在window是同时打开多个C?虽然它们所q行的程序代码都是一L,但是所使用的内存空间是独立?互不q扰.<br />  1.2什么是U程<br />  U程与进E相?是一D完成某个特定功能的代码,是程序中单个序的流控制;但与q程不同的是,同类的多个线E共享一块内存空间和一l系l资?而线E本w的数据通常只有微处理器的寄存器数据,以及一个供E序执行时用的堆栈<br />  1.3q程与线E的区别<br />  1. q程:每个q程都有独立的代码和数据I间(q程上下? ,<strong><a style="color: #000000" ><strong>tb</strong></a></strong>q程切换的开销?<br />  2. U程:轻量的进E?同一cȝE共享代码和数据I间,每个U程有独立的q行栈和E序计数?PC),U程切换的开销?<br />  3. 多进E?在操作系l中,能同时运行多个Q务程?<br />  4. 多线E?在同一应用E序?有多个顺序流同时执行.<br />  1.4U程创徏的两U方?br />  采用l承Threadcd建线E?br />  该方法比较简?主要是通过l承java.lang.Threadc?q覆盖Threadcȝrun()Ҏ来完成线成的创徏.Thread cL一个具体的c?即不是抽象类,该类装了线E的行ؓ.要创Z个线E?E序员必dZ个从 Thread cd出的新类.ThreadcM有两个最重要的函数run()和start().<br />  通过实现Runnable接口创徏U程<br />  该方法通过生成实现java.lang.Runnable接口的类.该接口只定义了一个方法run(),所以必d新类中实现它.但是 Runnable 接口q没有Q何对U程的支?我们q必d?Thread cȝ实例,q一炚w过 Thread cȝ构造函?br />  public Thread(Runnable target);来实?<br />  2 单线E和多线E性能比较<br />  以用蒙特卡|概率算法求πZ,q行单线E和多线E时间比?br />  2.1什么是蒙特卡罗概率法</p> <p>  蒙特卡罗?Monte Carlo method)是以概率和统计的理论、方法ؓ基础的一U计方?所求解的问题同一定的概率模型相联p?用电子计机实现l计模拟或抽?以获得问题的q似?故又U统计模拟法或统计试验法. --癑ֺ癄<br />  蒙特卡罗求算法求π<br />  W一?br />  L方Ş和内切圆<br />  W二?br />  变换表达?br />  正方形面UAs=(2R)^2<br />  圆的面积Ac=πR^2<br />  Ac/As=(2R)^2/πR^2<br />  π=4As/Ac<br />  令P=As/Sc,?#960;=4P<br />  W三?br />  重复Nơ实验求q_?br />  在正方Ş区域内随机生成一个点A,若A落在圆区域内,M++<br />  P=M/N<br />  π=4P,N的取D?π的D_<br />  2.2 java代码实现法<br />  N取gؓ10000?多线E的Cؓ100,每个U程执行100万次模拟实验<br />  U程实现<br />  import java.util.concurrent.CountDownLatch;<br />  public class ProModel implements Runnable {<br />  public int N;//随机实验的L?br />  public static int M;//随机点落在圆中的ơ数<br />  private int id;<br />  private final CountDownLatch doneSignal;<br />  OBJ semaphore;<br />  public ProModel(int id,CountDownLatch doneSignal,int N,OBJ semaphore2){<br />  this.id=id;<br />  this.doneSignal=doneSignal;<br />  this.N=N;<br />  this.semaphore=semaphore2;<br />  M=0;<br />  }<br />  public void run(){<br />  int tempM=0;<br />  for(int i=0;i<br />  if(isInCircle()){<br />  tempM++;<br />  }<br />  }<br />  synchronized (semaphore) {<br />  add(tempM);<br />  }<br />  doneSignal.countDown();//使end状态减1<br />  }<br />  public void add(int tempM){<br />  System.out.println(Thread.currentThread().getName());<br />  M=M+tempM;<br />  System.out.println(M);<br />  }<br />  //随机产生一个在正方形区域的?判断它是否在圆中<br />  public boolean isInCircle(){<br />  double x=Math.random();<br />  double y=Math.random();<br />  if((x-0.5)*(x-0.5)+(y-0.5)*(y-0.5)<0.25)<br />  return true;<br />  else<br />  return false;<br />  }<br />  public static int getTotal(){<br />  return M;<br />  }<br />  }<br />  多线EMain实现<br />  import java.util.concurrent.CountDownLatch;<br />  import java.util.concurrent.ExecutorService;<br />  import java.util.concurrent.Executors;<br />  public class MutliThread {<br />  public static void main(String[] args) throws InterruptedException {<br />  long begin=System.currentTimeMillis();<br />  int threadSize=100;<br />  int N=1000000;<br />  OBJ semaphore = new OBJ();<br />  CountDownLatch doneSignal = new CountDownLatch(threadSize);<br />  ProModel[] pros=new ProModel[threadSize];<br />  //讄特定的线E池,大小为threadSizde<br />  System.out.println(“begins!”);<br />  ExecutorService exe = Executors.newFixedThreadPool(threadSize);<br />  for(int i=0;i<br />  exe.execute(new ProModel(i+1,doneSignal,N,semaphore));<br />  try{<br />  doneSignal.await(); //{待end状态变?, }catch (InterruptedException e) {<br />  // TODO: handle exception35<br />  e.printStackTrace();<br />  }finally{<br />  System.out.println(“ends!”);<br />  System.out.println(4*(float)ProModel.getTotal()/(float)(threadSize*N));<br />  }<br />  exe.shutdown();<br />  long end=System.currentTimeMillis();<br />  System.out.println(“used time(ms):”+(end-begin));<br />  }<br />  }<br />  class OBJ{}<br />  单线EMain实现<br />  import java.util.concurrent.CountDownLatch;<br />  import java.util.concurrent.ExecutorService;<br />  import java.util.concurrent.Executors;<br />  public class SingleThread {<br />  public static void main(String[] args) {<br />  long begin=System.currentTimeMillis();<br />  int threadSize=1;<br />  int N=100000000;<br />  OBJ semaphore = new OBJ();<br />  CountDownLatch doneSignal = new CountDownLatch(threadSize);<br />  ProModel[] pros=new ProModel[threadSize];<br />  //讄特定的线E池,大小?<br />  System.out.println(“begins!”);<br />  ExecutorService exe = Executors.newFixedThreadPool(threadSize);<br />  for(int i=0;i<br />  exe.execute(new ProModel(i+1,doneSignal,N,semaphore));<br />  try{<br />  doneSignal.await(); //{待end状态变?, }catch (InterruptedException e) {<br />  // TODO: handle exception35<br />  e.printStackTrace();<br />  }finally{<br />  System.out.println(“ends!”);<br />  System.out.println(4*(float)ProModel.getTotal()/(float)(threadSize*N));<br />  }<br />  exe.shutdown();<br />  long end=System.currentTimeMillis();<br />  System.out.println(“used time(ms):”+(end-begin));<br />  }<br />  }</p><img src ="http://m.tkk7.com/tbwshc/aggbug/403246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/tbwshc/" target="_blank">chen11-1</a> 2013-08-23 16:54 <a href="http://m.tkk7.com/tbwshc/archive/2013/08/23/403246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Arrays.asListҎ 学习记录http://m.tkk7.com/tbwshc/archive/2013/07/15/401594.htmlchen11-1chen11-1Mon, 15 Jul 2013 09:08:00 GMThttp://m.tkk7.com/tbwshc/archive/2013/07/15/401594.htmlhttp://m.tkk7.com/tbwshc/comments/401594.htmlhttp://m.tkk7.com/tbwshc/archive/2013/07/15/401594.html#Feedback0http://m.tkk7.com/tbwshc/comments/commentRss/401594.htmlhttp://m.tkk7.com/tbwshc/services/trackbacks/401594.htmlArrays工具cL供了一些比较实用的ҎQ比如sort, binarySearch, fill{。其中还有一个asListҎQ此Ҏ能够一个变长参数或者数l{换成List?br />  但是Q这个生成的ListQ它是固定长度的Q如果对其进行add或者remove的操作,会抛出UnsupportedOperationExceptionQؓ什么会q样?
  带着疑问Q查看一下Arrays的源码,可以得到问题的结果?br />  Java代码
  /**
  * Returns a fixed-size list backed by the specified array. (Changes to
  * the returned list "write through" to the array.) This method acts
  * as bridge between array-based and collection-based APIs, in
  * combination with Collection.toArray. The returned list is
  * serializable and implements {@link RandomAccess}.
  *
  *
  This method also provides a convenient way to create a fixed-size
  * list initialized to contain several elements:
  *
  * List stooges = Arrays.asList("Larry", "Moe", "Curly");
  *
  *
  * @param a the array by which the list will be backed.
  * @return a list view of the specified array.
  * @see Collection#toArray()
  */
  public static List asList(T... a) {
  return new ArrayList(a);

  ҎasListq回的是new ArrayList(a)。但是,q个ArrayListq不是java.util.ArrayListQ它是一个ArrayscM的重新定义的内部cR?br />  具体的实现如下:
  Java代码
  /**
  * @serial include
  */
  private static class ArrayList extends AbstractList
  implements RandomAccess, java.io.Serializable
  {
  private static final long serialVersionUID = -2764017481108945198L;
  private Object[] a;
  ArrayList(E[] array) {
  if (array==null)
  throw new NullPointerException();
  a = array;
  }
  public int size() {
  return a.length;
  }
  public Object[] toArray() {
  return (Object[])a.clone();
  }
  public E get(int index) {
  return (E)a[index];
  }
  public E set(int index, E element) {
  Object oldValue = a[index];
  a[index] = element;
  return (E)oldValue;
  }
  public int indexOf(Object o) {
  if (o==null) {
  for (int i=0; i
  if (a[i]==null)
  return i;
  } else {
  for (int i=0; i
  if (o.equals(a[i]))
  return i;
  }
  return -1;
  }
  public boolean contains(Object o) {
  return indexOf(o) != -1;
  }
  }
  从这个内部类ArrayList的实现可以看出,它承了cAbstractList,但是没有重写add和removeҎQ没有给出具体的实现。查看一下AbstractListcM对add和removeҎ的定义,如果一个list不支持add和remove׃抛出UnsupportedOperationException?br />  Java代码
  public abstract class AbstractList extends AbstractCollection implements List {
  /**
  * Sole constructor. (For invocation by subclass constructors, typically
  * implicit.)
  */
  protected AbstractList() {
  }
  /**
  * Appends the specified element to the end of this List (optional
  * operation).
  *
  * This implementation calls add(size(), o).
  *
  * Note that this implementation throws an
  * UnsupportedOperationException unless add(int, Object)
  * is overridden.
  *
  * @param o element to be appended to this list.
  *
  * @return true (as per the general contract of
  * Collection.add).
  *
  * @throws UnsupportedOperationException if the add method is not
  * supported by this Set.
  *
  * @throws ClassCastException if the class of the specified element
  * prevents it from being added to this set.
  *
  * @throws IllegalArgumentException some aspect of this element prevents
  * it from being added to this collection.
  */
  public boolean add(E o) {
  add(size(), o);
  return true;
  }
  /**
  * Inserts the specified element at the specified position in this list
  * (optional operation). Shifts the element currently at that position
  * (if any) and any subsequent elements to the right (adds one to their
  * indices).
  *
  * This implementation always throws an UnsupportedOperationException.
  *
  * @param index index at which the specified element is to be inserted.
  * @param element element to be inserted.
  *
  * @throws UnsupportedOperationException if the add method is not
  * supported by this list.
  * @throws ClassCastException if the class of the specified element
  * prevents it from being added to this list.
  * @throws IllegalArgumentException if some aspect of the specified
  * element prevents it from being added to this list.
  * @throws IndexOutOfBoundsException index is out of range (index <
  * 0 || index > size()).
  */
  public void add(int index, E element) {
  throw new UnsupportedOperationException();
  }
  /**
  * Removes the element at the specified position in this list (optional
  * operation). Shifts any subsequent elements to the left (subtracts one
  * from their indices). Returns the element that was removed from the
  * list.
  *
  * This implementation always throws an
  * UnsupportedOperationException.
  *
  * @param index the index of the element to remove.
  * @return the element previously at the specified position.
  *
  * @throws UnsupportedOperationException if the remove method is
  * not supported by this list.
  * @throws IndexOutOfBoundsException if the specified index is out of
  * range (index < 0 || index >= size()).
  */
  public E remove(int index) {
  throw new UnsupportedOperationException();
  }
  }
  xQؓ什么Arrays.asList产生的List是不可添加或者删除,否则会生UnsupportedOperationExceptionQ就可以得到解释了?br />  如果我们x一个变长或者数据{变成ListQ?而且tb期望q个List能够q行add或者remove操作Q那该怎么做呢?
  我们可以写一个类似的ҎQ里面直接采用java.util.ArrayList卛_?br />  比如Q?br />  Java代码
  import java.util.ArrayList;
  import java.util.Collections;
  import java.util.List;
  public class MyArrays {
  public static List asList(T... a) {
  List list = new ArrayList();
  Collections.addAll(list, a);
  return list;
  }
  }
  试代码如下Q?br />  Java代码
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.List;
  public class Test {
  @SuppressWarnings("unchecked")
  public static void main(String[] args) {
  List stooges = Arrays.asList("Larry", "Moe", "Curly");
  print(stooges);
  List> seasonsList = Arrays.asList(retrieveSeasonsList());
  print(seasonsList);
  /*
  * 自己实现一个asListҎQ能够添加和删除?br />  */
  List list = MyArrays.asList("Larry", "Moe", "Curly");
  list.add("Hello");
  print(list);
  }
  private static void print(List list) {
  System.out.println(list);
  }
  private static List retrieveSeasonsList() {
  List seasonsList = new ArrayList();
  seasonsList.add("Spring");
  seasonsList.add("Summer");
  seasonsList.add("Autumn");
  seasonsList.add("Winter");
  return seasonsList;
  }
  }
  输出l果Q?br />  [Larry, Moe, Curly]
  [[Spring, Summer, Autumn, Winter]]
  [Larry, Moe, Curly, Hello]



chen11-1 2013-07-15 17:08 发表评论
]]>
վ֩ģ壺 ƷƵȫѹۿ | ɫƷһ234| ޹ۺ˳ۺվ| һ| ѧһػƵѴƬƵ| a߹ۿ| þþþþþƷο| ۺС˵| ëƬ߲ѹۿ| þ޾ƷAB벥| þ99Ʒѿ| þþþþAv뾫Ʒר| þþþþùƷͬ| 91˾Ʒϵȫ| ŷ˳ɾƷѹۿ| պ| ѹŮˬˮƵ| һëƬ߲Ƶѹۿ| 㽶Ʒ鶹| þþþþþþþѾƷ| VA߹ۿ| 97߹ѹۿ| ˾Ʒձר6| Ѱββ8x| aëƬƵѹۿӰԺ| ޱ龫Ʒһ| ձ߿Ƭ˳Ƶ1000| һƷƵ| ƷɫҹƵ| պAVһ| ޹㽶| ˼Ƶ| һ3Ƶ| Ӱַ| ݹѾþþ91| òѸ| ޹˾þۺһ| ޸һѿ| þþƷһ| ޹ҹƷƬ߲| ĻۺϾþò|